2015-04-18 5 views
0

Как я могу поместить onclicklistner в указанную строку, которую пользователь искал в searchView. ive пытался выяснить, как это сделать, но когда я делаю это, он всегда показывает тост первой строки или ссылку Uri. Может кто-нибудь мне помочь??OnClickListener в элементе Listview Filter

как, например, когда я ищу ABC, я хочу щелкнуть по нему, чтобы увидеть тост или ссылку Uri, когда я нажму на нее.

Employee.java

public class Employee { 

private String name; 
private int age; 

public Employee(String name,int age){ 
    this.name = name; 
    this.age = age; 
} 

public String getName(){ 
    return name; 
} 

public int getAge(){ 
    return age; 
}} 

EmployeeAdapter.java

public class EmployeeAdapter extends BaseAdapter implements Filterable { 

public Context context; 
public ArrayList<Employee> employeeArrayList; 
public ArrayList<Employee> orig; 

public EmployeeAdapter(Context context, ArrayList<Employee> employeeArrayList) { 
    super(); 
    this.context = context; 
    this.employeeArrayList = employeeArrayList; 
} 


public class EmployeeHolder 
{ 
    TextView name; 
    TextView age; 
} 

public Filter getFilter() { 
    return new Filter() { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      final FilterResults oReturn = new FilterResults(); 
      final ArrayList<Employee> results = new ArrayList<Employee>(); 
      if (orig == null) 
       orig = employeeArrayList; 
      if (constraint != null) { 
       if (orig != null && orig.size() > 0) { 
        for (final Employee g : orig) { 
         if (g.getName().toLowerCase() 
           .contains(constraint.toString())) 
          results.add(g); 
        } 
       } 
       oReturn.values = results; 
      } 
      return oReturn; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      employeeArrayList = (ArrayList<Employee>) results.values; 
      notifyDataSetChanged(); 
     } 
    }; 
} 

public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
} 


@Override 
public int getCount() { 
    return employeeArrayList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return employeeArrayList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    EmployeeHolder holder; 
    if(convertView==null) 
    { 
     convertView=LayoutInflater.from(context).inflate(R.layout.row, parent, false); 
     holder=new EmployeeHolder(); 
     holder.name=(TextView) convertView.findViewById(R.id.txtName); 
     holder.age=(TextView) convertView.findViewById(R.id.txtAge); 
     convertView.setTag(holder); 
    } 
    else 
    { 
     holder=(EmployeeHolder) convertView.getTag(); 
    } 

    holder.name.setText(employeeArrayList.get(position).getName()); 
    holder.age.setText(String.valueOf(employeeArrayList.get(position).getAge())); 

    return convertView; 

}} 

MainActivity.java

public class MainActivity extends Activity implements SearchView.OnQueryTextListener{ 
private SearchView mSearchView; 
private ListView mListView; 
private ArrayList<Employee> employeeArrayList; 
private EmployeeAdapter employeeAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mSearchView=(SearchView) findViewById(R.id.searchView1); 
    mListView=(ListView) findViewById(R.id.listView1); 

    employeeArrayList=new ArrayList<Employee>(); 
    employeeArrayList.add(new Employee("ABC", 24)); 
    employeeArrayList.add(new Employee("ACB", 24)); 
    employeeArrayList.add(new Employee("BVF", 28)); 
    employeeArrayList.add(new Employee("BRT", 28)); 
    employeeArrayList.add(new Employee("ANM", 23)); 

    employeeAdapter=new EmployeeAdapter(MainActivity.this, employeeArrayList); 
    mListView.setAdapter(employeeAdapter); 

    mListView.setTextFilterEnabled(true); 
    setupSearchView(); 
    registerClickCallback(); 


} 


private void registerClickCallback() { 
    ListView list = (ListView) findViewById(R.id.listView1); 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 


      Employee pick = employeeArrayList.get(position); 

      String message = "You Selected " + pick.getName(); 

      Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); 

     } 
    }); 
} 

private void setupSearchView() 
{ 
    mSearchView.setIconifiedByDefault(false); 
    mSearchView.setOnQueryTextListener(this); 
    mSearchView.setSubmitButtonEnabled(true); 
    mSearchView.setQueryHint("Search Here"); 
} 

@Override 
public boolean onQueryTextChange(String newText) 
{ 

    if (TextUtils.isEmpty(newText)) { 
     mListView.clearTextFilter(); 
    } else { 
     mListView.setFilterText(newText); 
    } 
    return false; 
} 

@Override 
public boolean onQueryTextSubmit(String query) 
{ 
    return false; 
}} 

Спасибо заранее!

+0

Что вы подразумеваете под 'в указанной строке, которую пользователь искал в searchView'? вам не нужен элемент clickListener для всех строк? – Rami

+0

Я хочу, чтобы на всех строках был элемент clickListener. его просто, когда я что-то ищу в поиске. и используйте clickListener, он всегда показывает первый кликлайнер строк, а не тот, который я искал. –

+0

Опубликуйте свой код (где вы реализуете clickListener). – Rami

ответ

-1

Его простой,

в вашем onItemClickListener(), попробуйте использовать employeeadapter.getItem() вместо employeearraylist.get().

Пробуйте и комментируйте результат. : D

Btw, ваш адаптер уже загружен с целью утилизации предметов. Не очень хорошая идея также накладывать на него фильтрующую нагрузку.

Просто выполните фильтрацию внутри вашей активности и заставьте ее вернуть arraylist и просто установите адаптер списка для этого arraylist и снова вызовите setOnItemClickListener(), чтобы изменить существующий onItemClickListener().

+0

mListView.setOnItemClickListener (новый AdapterView.OnItemClickListener() { @Override общественной пустотой onItemClick (AdapterView parent, View view, int position, long id) { Toast.makeText (MainActivity.this, "Вы выбрали" + employeeAdapter.getItem (позиция), Toast.LENGTH_LONG) .show(); } }); ' Я положил это и все еще не работает, когда я нажимаю на него. он говорит об ошибке. –

+0

Не могли бы вы выслать мне классы, и я дам вам правильный выбор завтра, то есть, если вы готовы поделиться. – TheAnimatrix

Смежные вопросы