Cambiar filtro AutoCompleteTextView de "startsWith" a "Contains"?

Me gustaría cambiar el filtrado predeterminado en AutoCompleteTextView . El filtro predeterminado encuentra todas las cadenas que comienza con el token dado. Mi proyecto requiere que el filtrado encuentre todas las cadenas que contengan el token dado.

¿Es posible?

3 Solutions collect form web for “Cambiar filtro AutoCompleteTextView de "startsWith" a "Contains"?”

He encontrado una solución para eso, gracias a Google y la búsqueda de dos días. Como @ torque203 sugirió, he implementado mi propio adaptador personalizado. En primer lugar, defina un nuevo archivo XML en el elemento personalizado en el adaptador:

Autocomplete_item.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:paddingLeft="8dp" android:paddingRight="8dp" android:paddingTop="16dp" android:paddingBottom="16dp" android:id="@+id/lbl_name" /> </RelativeLayout> 

Crear una nueva clase para sus nombres:

Nombres

 public class Names { public String name; } 

NamesAdapter

 public class NamesAdapter extends ArrayAdapter<Names> { Context context; int resource, textViewResourceId; List<Names> items, tempItems, suggestions; public NamesAdapter(Context context, int resource, int textViewResourceId, List<Names> items) { super(context, resource, textViewResourceId, items); this.context = context; this.resource = resource; this.textViewResourceId = textViewResourceId; this.items = items; tempItems = new ArrayList<Names>(items); // this makes the difference. suggestions = new ArrayList<Names>(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.autocomplete_item, parent, false); } Names names = items.get(position); if (names != null) { TextView lblName = (TextView) view.findViewById(R.id.lbl_name); if (lblName != null) lblName.setText(names.name); } return view; } @Override public Filter getFilter() { return nameFilter; } /** * Custom Filter implementation for custom suggestions we provide. */ Filter nameFilter = new Filter() { @Override public CharSequence convertResultToString(Object resultValue) { String str = ((Names) resultValue).name; return str; } @Override protected FilterResults performFiltering(CharSequence constraint) { if (constraint != null) { suggestions.clear(); for (Names names : tempItems) { if (names.name.toLowerCase().contains(constraint.toString().toLowerCase())) { suggestions.add(names); } } FilterResults filterResults = new FilterResults(); filterResults.values = suggestions; filterResults.count = suggestions.size(); return filterResults; } else { return new FilterResults(); } } @Override protected void publishResults(CharSequence constraint, FilterResults results) { List<Names> filterList = (ArrayList<Names>) results.values; if (results != null && results.count > 0) { clear(); for (Names names : filterList) { add(names); notifyDataSetChanged(); } } } }; } 

SearchActivity (o su actividad principal)

 .... List<Names> namesList = //your names list; NamesAdapter namesAdapter = new NamesAdapter( SearchActivity.this, R.layout.activity_search, R.id.lbl_name, namesList ); //set adapter into listStudent autoCompleteTextView.setAdapter(namesAdapter); autoCompleteTextView.showDropDown(); ... 

Si es posible.

Primera vía:

Debe crear un adaptador personalizado que implemente ListAdapter y Filterable .

El Filtro puede implementar su lógica de filtro "contiene".

Y se establece este adaptador como el adaptador a su AutoCompleteTextView.

Segunda vía:

Si ya está utilizando ArrayAdapter . Podría simplemente anular su método getFilter () .

Sólo para ampliar la respuesta agradable de Caffe Latte:

1) autoCompleteTextView.showDropDown(); no es necesario.

2) Para recuperar el objeto de entrada se puede utilizar:

 //retrieve the input in the autoCompleteTextView autoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() { //parent The AdapterView where the click happened. //view The view within the AdapterView that was clicked (this will be a view provided by the adapter) //position The position of the view in the adapter //id The row id of the item that was clicked. public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) { String selection =parent.getItemAtPosition(position).toString(); Toast.makeText(parent.getContext(),"" + selection,Toast.LENGTH_SHORT).show(); } }); 

El objeto recuperado de los padres debe tener un método toString () implementado.

  • Android AutoCompleteTextView con '@' menciona el filtrado como twitter y facebook
  • AutoCompleteTextView no mostrar el resultado incluso cuando el ArrayAdapter se actualiza
  • AutoCompleteTextView no funciona cuando introdujo el primer carácter
  • Sugerencia de float de AutoCompleteTextView
  • AutoCompleteTextView respaldado por CursorLoader
  • AutoCompleteTextView no reconoce espacios
  • AutoCompleteTextView: quita el teclado suave en la parte posterior de la prensa en lugar de sugerencias
  • ¿Cómo uso el método publishResults () al extender los filtros en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.