¿Cómo puedo filtrar los datos de ListView al escribir en EditText en Android

Tengo un ListView y un EditText . ¿Cómo puedo filtrar los datos ListView cuando EditText en EditText ?

  1. Agregar TextWatcher a EditText#addTextChangedListener
  2. En onTextChanged agrega o elimina elementos del adaptador de tu ListView . Si está subclasificando ArrayAdapter , habría add y remove métodos

Sí, puedes, simplemente implementa este código. Utilice el siguiente código para implementar la búsqueda y la lista de filtros en Android:

SearchAndFilterList.java

 public class SearchAndFilterList extends Activity { private ListView mSearchNFilterLv; private EditText mSearchEdt; private ArrayList mStringList; private ValueAdapter valueAdapter; private TextWatcher mSearchTw; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_and_filter_list); initUI(); initData(); valueAdapter=new ValueAdapter(mStringList,this); mSearchNFilterLv.setAdapter(valueAdapter); mSearchEdt.addTextChangedListener(mSearchTw); } private void initData() { mStringList=new ArrayList(); mStringList.add("one"); mStringList.add("two"); mStringList.add("three"); mStringList.add("four"); mStringList.add("five"); mStringList.add("six"); mStringList.add("seven"); mStringList.add("eight"); mStringList.add("nine"); mStringList.add("ten"); mStringList.add("eleven"); mStringList.add("twelve"); mStringList.add("thirteen"); mStringList.add("fourteen"); mSearchTw=new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { valueAdapter.getFilter().filter(s); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }; } private void initUI() { mSearchNFilterLv=(ListView) findViewById(R.id.list_view); mSearchEdt=(EditText) findViewById(R.id.txt_search); } } 

Adaptador de valor personalizado: ValueAdapter.java

 public class ValueAdapter extends BaseAdapter implements Filterable{ private ArrayList mStringList; private ArrayList mStringFilterList; private LayoutInflater mInflater; private ValueFilter valueFilter; public ValueAdapter(ArrayList mStringList,Context context) { this.mStringList=mStringList; this.mStringFilterList=mStringList; mInflater=LayoutInflater.from(context); getFilter(); } //How many items are in the data set represented by this Adapter. @Override public int getCount() { return mStringList.size(); } //Get the data item associated with the specified position in the data set. @Override public Object getItem(int position) { return mStringList.get(position); } //Get the row id associated with the specified position in the list. @Override public long getItemId(int position) { return position; } //Get a View that displays the data at the specified position in the data set. @Override public View getView(int position, View convertView, ViewGroup parent) { Holder viewHolder; if(convertView==null) { viewHolder=new Holder(); convertView=mInflater.inflate(R.layout.list_item,null); viewHolder.nameTv=(TextView)convertView.findViewById(R.id.txt_listitem); convertView.setTag(viewHolder); }else{ viewHolder=(Holder)convertView.getTag(); } viewHolder.nameTv.setText(mStringList.get(position).toString()); return convertView; } private class Holder{ TextView nameTv; } //Returns a filter that can be used to constrain data with a filtering pattern. @Override public Filter getFilter() { if(valueFilter==null) { valueFilter=new ValueFilter(); } return valueFilter; } private class ValueFilter extends Filter { //Invoked in a worker thread to filter the data according to the constraint. @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results=new FilterResults(); if(constraint!=null && constraint.length()>0){ ArrayList filterList=new ArrayList(); for(int i=0;i) results.values; notifyDataSetChanged(); } } 

activity_search_and_filter_list.xml

     

list_item.xml

     

AndroidManifext.xml

            

Espero que este código sea útil para implementar una búsqueda personalizada y una lista de filtros.

Puedes usar:

http://developer.android.com/reference/android/widget/TextView.html

addTextChangedListener( TextWatcher watcher )

para averiguar cuándo se modificó la vista de texto. Creo que debería llamarse cada vez que se agrega o elimina una letra.

A continuación, actualice su adaptador de lista para mostrar los nuevos elementos por:

  1. creando un nuevo adaptador de lista y rellenándolo con los elementos que satisfacen el filtro o
  2. tener una subclase de BaseAdapter para aceptar su filtro y llamar a notifyDataSetChanged() después de que haya terminado de eliminar los elementos que ya no desea

http://developer.android.com/reference/android/widget/BaseAdapter.html

Buscar una vista de lista basada en la entrada en EditText

  public class MainActivity extends Activity { private ListView lv,lv2; private EditText et; String listview_array[]={"01634 ABOHAR","080 Bangalore","011 Delhi","Dell Inspiron", "HTC One X", "HTC Wildfire S", "HTC Sense", "1234", "iPhone 4S", "Samsung Galaxy Note 800", "Samsung Galaxy S3", "MacBook Air", "Mac Mini", "MacBook Pro"}; private ArrayList array_sort = new ArrayList(); int textlength = 0; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.ListView01); lv2 = (ListView) findViewById(R.id.ListView02); et = (EditText) findViewById(R.id.EditText01); lv.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, listview_array)); int x= lv.getHeaderViewsCount (); System.out.println("x========"+x); lv.setAdapter(new ArrayAdapter (MainActivity.this, android.R.layout.simple_list_item_1, listview_array)); et.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { // Abstract Method of TextWatcher Interface. } public void beforeTextChanged(CharSequence s, int start, int count, int after) { // Abstract Method of TextWatcher Interface. } public void onTextChanged(CharSequence s, int start, int before, int count) { textlength = et.getText().length(); array_sort.clear(); for (int i = 0; i < listview_array.length; i++) { if (textlength <= listview_array[i].length()) { String s2= et.getText().toString(); if(listview_array[i].toString().contains(et.getText().toString())) { array_sort.add(listview_array[i]); } } } lv.setAdapter(new ArrayAdapter (MainActivity.this, android.R.layout.simple_list_item_1, array_sort)); } }); } } 

Para la búsqueda en la vista de lista personalizada basada en el elemento de la clase, consulte la búsqueda del implemento de enlace en una vista de lista personalizada . Modifíquelo de acuerdo a sus necesidades.

1) cree un adaptador personalizado para su vista de lista y cree un método removeIfMatch (String s):

 public void removeIfMatch(String s) { for item in adapter: if item.matches(s) { data.removeItem(item); notifyDataSetChanged(); break } } 

2) crear una callback para cuando el contenido EditText cambie

3) invocar adapter.removeIfMatch (editText.getText ())