Lista de búsqueda de Android al escribir

¿Cómo puedo construir una barra de búsqueda donde mientras estoy escribiendo los resultados se muestran en el ListView en el que estoy buscando?

Por ejemplo, tengo una vista de lista con 20 cadenas. Presiono la tecla de búsqueda y aparece la barra. Quiero cuando escribo 3 palabras o más la búsqueda comienza a correr mostrando los resultados en la vista de lista (como un filtro: solo muestra las cadenas de la lista que coinciden con lo que escribo)

No puede hacer esto con la barra de búsqueda. Pero el listview tiene la posibilidad de filtrar en la tecla presionada , como se hace en los contactos. El usuario simplemente comienza a escribir y la lista se filtra entonces. Filtrar no es realmente como buscar. Si la lista contiene la palabra foo en algún lugar y escribe oo foo se filtrará, pero si escribe fo se mantendrá incluso si el elemento de lista es foo de barra de llamadas.

Simplemente tienes que habilitarlo:

 ListView lv = getListView(); lv.setTextFilterEnabled(true); 

No sé cómo se hace esto si no tienes un teclado de hardware. Estoy usando el androide y comenzar a escribir arranca la lista para filtrar y mostrar sólo los resultados coincidentes.

Creo que esto es lo que buscas:

http://www.java2s.com/Code/Android/2D-Graphics/ShowsalistthatcanbefilteredinplacewithaSearchViewinnoniconifiedmode.htm

Haga que su actividad implemente SearchView.OnQueryTextListener

Y agregue los siguientes métodos:

 public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { mListView.clearTextFilter(); } else { mListView.setFilterText(newText.toString()); } return true; } public boolean onQueryTextSubmit(String query) { return false; } 

Utilicé un EditText para hacer el trabajo.

Primero creé dos copias de la matriz para mantener la lista de datos a buscar:

 List<Map<String,String>> vehicleinfo; List<Map<String,String>> vehicleinfodisplay; 

Una vez que tengo mis datos de la lista de alguna parte, lo copio:

 for(Map<String,String>map : vehicleinfo) { vehicleinfodisplay.add(map); } 

Y usar un SimpleAdapter para mostrar la versión de la pantalla (copiada) de mis datos:

 String[] from={"vehicle","dateon","dateoff","reg"}; int[] to={R.id.vehicle,R.id.vehicledateon,R.id.vehicledateoff,R.id.vehiclereg}; listadapter=new SimpleAdapter(c,vehicleinfodisplay,R.layout.vehiclelistrow,from,to); vehiclelist.setAdapter(listadapter); 

A continuación, agregué un TextWatcher al EditText que responde a un evento afterTextChanged borrando la versión de visualización de la lista y agregando de nuevo sólo los elementos de la otra lista que cumplen los criterios de búsqueda (en este caso, el campo "reg" contiene la búsqueda cuerda). Una vez que la lista de visualización se llena con la lista filtrada, sólo llamo notifyDataSetChanged en el notifyDataSetChanged de la lista.

 searchbox.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { vehicleinfodisplay.clear(); String search=s.toString(); for(Map<String,String>map : vehicleinfo) { if(map.get("reg").toLowerCase().contains(search.toLowerCase())) vehicleinfodisplay.add(map); listadapter.notifyDataSetChanged(); } }; ... other overridden methods can go here ... }); 

Espero que esto sea útil para alguien.

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<String> 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<String>(); 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<String> mStringList; private ArrayList<String> mStringFilterList; private LayoutInflater mInflater; private ValueFilter valueFilter; public ValueAdapter(ArrayList<String> 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<String> filterList=new ArrayList<String>(); for(int i=0;i<mStringFilterList.size();i++){ if(mStringFilterList.get(i).contains(constraint)) { filterList.add(mStringFilterList.get(i)); } } results.count=filterList.size(); results.values=filterList; }else{ results.count=mStringFilterList.size(); results.values=mStringFilterList; } return results; } //Invoked in the UI thread to publish the filtering results in the user interface. @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { mStringList=(ArrayList<String>) results.values; notifyDataSetChanged(); } } } 

Activity_search_and_filter_list.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/txt_search" tools:context=".SearchAndFilterList" android:hint="Enter text to search" /> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/list_view" android:layout_below="@+id/txt_search"></ListView> </RelativeLayout> 

List_item.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txt_listitem"/> </RelativeLayout> 

AndroidManifext.xml

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.searchandfilterlistview" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".SearchAndFilterList" android:label="@string/title_activity_search_and_filter_list" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Espero que este código sea útil para implementar la búsqueda personalizada y filtrar listview

La mejor manera es usar la barra de búsqueda o el SearchManager integrados al sobreescribir onSearchRequested en una actividad de búsqueda. Puede establecer un origen de datos para buscar en para obtener la caída automática de resultados o sólo puede tomar en la entrada del usuario y buscar después. Aquí hay una buena visión general de SearchManager es un Plus hay una demostración de trabajo en el proyecto API Demos com.example.android.apis.app.SearchQueryResult

 @Override public boolean onSearchRequested() { 
  • ¿Cómo puedo filtrar el listview con baseadapter?
  • Evite que la actividad se recargue al hacer clic en SearchView
  • Actividad de búsqueda que se llama dos veces
  • ¿Cómo quitar el texto emergente de la búsqueda del android de búsqueda mientras que busca?
  • Android - colapse searchview after submit
  • API de AdMob y palabras clave
  • Android: obtener el historial de búsqueda de google?
  • Cómo eliminar el foco de SearchView?
  • La búsqueda crea nuevas actividades en TabActivity
  • Horizontal ProgressBar: Cambiar entre determinado e indeterminado
  • Reutilización de la barra de acción en todas las actividades de aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.