2015-01-22 3 views
0

У меня есть edittext и listview в моем приложении, список контактов списка просмотров. Я хочу фильтр списка с edittext. Я искал много на Google и нашел несколько examles, но никто не работал для меня, вот моего кодапараметр поиска в пользовательском listview

my custom adapter: 

public class CustomAdapter extends BaseAdapter 
{ 


    Fragment frgmnt; 
    ArrayList<HashMap<String, ArrayList>> contactarr; 

    LayoutInflater inflater; 

    public CustomAdapter(Fragment1 frgmnt, ArrayList<HashMap<String, ArrayList>> contactarr) 
    { 
     // 
     originalData=contactarr; 
     filteredData=contactarr; 


     this.frgmnt=frgmnt; 
     this.contactarr=contactarr;    
     inflater= (LayoutInflater)getActivity().getSystemServic(Context.LAYOUT_INFLATER_SERVICE); 
     this.contactarrsrch=new ArrayList<HashMap<String, ArrayList>>(); 
     this.contactarrsrch.addAll(contactarr); 
    } 
    @Override 
    public int getCount() 
    {   
     return filteredData.size(); 
    } 

    @Override 
    public Object getItem(int position) 
    { 
     return filteredData.get(position); 
     //return null; 
    } 

    @Override 
    public long getItemId(int position) 
    { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup parent) 
    { 
     if(view==null) 
     { 
      view=inflater.inflate(R.layout.list_data,null); 
     } 
     LinearLayout ll_row =(LinearLayout) view.findViewById(R.id.ll_row); 
     TextView txtContact = (TextView) view.findViewById(R.id.contact_name); 

     HashMap<String, ArrayList> map=contactarr.get(position);    
     ArrayList name =map.get("Name_"); 
     txtContact.setText(name.get(0).toString()); 

     return view; 
    } 
} 

this is in onCrate(): 

InputSearch.addTextChangedListener(new TextWatcher() 
    {     
     final ArrayList<HashMap<String,ArrayList>> tempArrayList =new ArrayList<HashMap<String,ArrayList>>(contactarr1); 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) 
     { 
     String text = InputSearch.getText().toString().toLowerCase(Locale.getDefault()); 
     //adapter.getFilter(s.toString()); 
     int textlength = s.length(); 
     for (HashMap<String, ArrayList> wp : tempArrayList) 
     { 

       if(textlength<=wp.get("Name_").toString().length()) 
       { 
       if ((wp.get("Name_").toString()).toLowerCase().contains(s.toString().toLowerCase())) 
       {  
        tempArrayList.add(wp);   
       } 
       } 
     } 
     adapter=new CustomAdapter(Fragment1.this, tempArrayList); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) 
     {}    
     @Override 
     public void afterTextChanged(Editable s) 
     {} 
    }); 

я не знаю, почему фильтр не работает, когда я напечатал Somthing в редактировании тексте

+0

В этой строке 'адаптер = новый CustomAdapter (Fragment1.this, tempArrayList);' вы только инициализируетесь ваш 'adapter' после фильтрации данных по тексту изменены, но вы не установили этот адаптер в вашем списке, и вам также нужно обновить свой адаптер. Так что есть проблема. Поэтому напишите еще две строки: listview.setAdapter (адаптер); '' adapter.notifyDatasetChanged(); ' – Piyush

+0

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

+0

Да, это означает, что вы не установили свой адаптер в listview. – Piyush

ответ

0

Вы должны создать свой собственный адаптер как это:

public class CompanyListAdapter extends BaseAdapter implements Filterable { 

    private List<Company> companies; 
    private List<Company> filteredCompanies; 
    private CompanyFilter mFilter = new CompanyFilter(); 

    private Context context; 

    public CompanyListAdapter(Context context, ArrayList<Company> products) { 
     super(context, R.layout.company_list_item, products); 
     this.context = context; 
     this.products = products; 
     this.filteredCompanies = products; 
    } 

    @Override 
    public int getCount() { 
     return filteredCompanies == null 0 : filteredCompanies.size(); 
    } 

    @Override 
    public Company getItem(int position) { 
     return filteredCompanies.get(position); 
    } 

    @Override 
     public Filter getFilter() { 
     return mFilter; 
    } 
} 

Далее вам нужно будет создать класс, который расширяет Filter для выполнения вашей фильтрации:

private class CompanyFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     String filterString = constraint.toString().toLowerCase(); 
     FilterResults results = new FilterResults(); 

     final List<Company> list = companies; 

     int count = list.size(); 
     final ArrayList<Company> nlist = new ArrayList<Company>(count); 

     Company filterableCompany; 

     for (int i = 0; i < count; i++) { 
      filterableCompany = list.get(i); 
      if (filterableCompany.getName().toLowerCase().contains(filterString)) { 
       nlist.add(filterableCompany); 
      } 
     } 

     results.values = nlist; 
     results.count = nlist.size(); 

     return results; 
    } 

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

И использовать это в вашей Fragment или Activity вы должны добавить TextWatcher к вашему EditText и фильтр соответственно:

txtSearch.addTextChangedListener(new TextWatcher() { 

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
     adapter.getFilter().filter(s.toString()); 
    } 
}); 
+0

но его не работает для пользовательского адаптера. что делать в случае, если у меня есть customadapter –

+0

i dont не подлежит вашему коду –

+0

Я обновил свой код для использования с «BaseAdapter», пожалуйста, просмотрите. – Leigh

0

Декларация

private ArrayAdapter<String> xListAdapter; 

EditText xSearchParty; 

Назначение

xLvParty = (ListView) findViewById(R.id.lvparty); 
xSearchParty = (EditText) findViewById(R.id.inputSearch); 

TextChanged Слушатель

xSearchParty.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void onTextChanged(CharSequence cs, int arg1, int arg2, 
         int arg3) { 
        // When user changed the Text 
        FILENAME.this.xListAdapter.getFilter().filter(cs); 
       } 


      }); 

Я надеюсь, что этот код может решить вашу проблему

+0

Я создал один пользовательский адаптер не простой ArrayAdapater. в случае пользовательского адаптера, что делать? –

+0

Кто-нибудь есть, чтобы помочь? –