No hay resultados con ArrayAdapter Filter

Estoy utilizando el ArrayAdapter en un AutoCompleteTextView. Results.values ​​tiene el valor esperado pero no obtengo ninguna lista en la interfaz de usuario.

public class CustomArrayAdapter extends ArrayAdapter<String> implements Filterable { private final Object mLock = new Object(); private CustomFilter mFilter; public ArrayList<String> mItems; public ArrayList<String> mFiltered; public CustomArrayAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); mItems = new ArrayList<String>(); mFiltered = new ArrayList<String>(); } public Filter getFilter() { if (mFilter == null) { mFilter = new CustomFilter(); } return mFilter; } @Override public void add(String s) { mItems.add(s); } private class CustomFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if (mItems == null) { synchronized (mLock) { mItems = new ArrayList<String>(); } } if (constraint == null || constraint.length() == 0) { synchronized (mLock) { results.values = mItems; results.count = mItems.size(); } } else { final ArrayList<String> newItems = new ArrayList<String>(); for (int i = 0; i < mItems.size(); i++) { final String item = mItems.get(i); if(item.contains(constraint)) { newItems.add(item); } } results.values = newItems; results.count = newItems.size(); } return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { mFiltered.clear(); mFiltered.addAll((ArrayList<String>) results.values); notifyDataSetChanged(); } } } 

Parece que el reemplazo de un par más funciones hicieron el trabajo. Fuente completa de la versión de trabajo:

 public class CustomArrayAdapter extends ArrayAdapter<String> implements Filterable { private List<String> mOrigionalValues; private List<String> mObjects; private Filter mFilter; public CustomArrayAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); mOrigionalValues = new ArrayList<String>(); mObjects = new ArrayList<String>(); } public void add(String object) { mOrigionalValues.add(object); this.notifyDataSetChanged(); } @Override public int getCount() { return mObjects.size(); } @Override public String getItem(int position) { return mObjects.get(position); } public Filter getFilter() { if (mFilter == null) { mFilter = new CustomFilter(); } return mFilter; } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); } private class CustomFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if(constraint == null || constraint.length() == 0) { ArrayList<String> list = new ArrayList<String>(mOrigionalValues); results.values = list; results.count = list.size(); } else { ArrayList<String> newValues = new ArrayList<String>(); for(int i = 0; i < mOrigionalValues.size(); i++) { String item = mOrigionalValues.get(i); if(item.contains(constraint)) { newValues.add(item); } } results.values = newValues; results.count = newValues.size(); } return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { mObjects = (List<String>) results.values; Log.d("CustomArrayAdapter", String.valueOf(results.values)); Log.d("CustomArrayAdapter", String.valueOf(results.count)); notifyDataSetChanged(); } } } 

Es necesario sobrescribir el método getCount en CustomArrayAdapter:

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

Y modifique su código de método publishResults:

 protected void publishResults(CharSequence constraint,FilterResults results) { mFiltered = (List<String>) results.values; notifyDataSetChanged(); } 

Hay algunos días que he estado investigando en la red sobre cómo hacer la investigación en arraylist con hashmap y por suerte me encontré con este post.

Hice mi adaptación a arraylist> y funcionó. Y ahora estoy compartiendo contigo, sabrás que hay alguien como la misma pregunta usando ArrayList y HashMap. Gracias Pim Reijersen!

 public class CategoriaAdapterModel extends BaseAdapter implements Filterable { private Activity context; private ArrayList<HashMap<String, String>> mDataShown; private ArrayList<HashMap<String, String>> mAllData; private Filter mFilter; private LayoutInflater inflater; DownloadImagemUtil downloader; public CategoriaAdapterModel(Activity context, ArrayList<HashMap<String, String>> data) { this.context = context; this.mAllData = data; this.mDataShown = data; downloader = new DownloadImagemUtil(context); } public void add(HashMap<String, String> object) { mAllData.add(object); this.notifyDataSetChanged(); } public int getCount() { return mDataShown.size(); } public Object getItem(int position) { return mDataShown.get(position); } public long getItemId(int position) { return position; } public Filter getFilter() { if (mFilter == null) { mFilter = new CustomFilter(); } return mFilter; } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); } private class CustomFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if (constraint == null || constraint.length() == 0) { ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>( mAllData); results.values = list; results.count = list.size(); } else { ArrayList<HashMap<String, String>> newValues = new ArrayList<HashMap<String, String>>(); for (int i = 0; i < mAllData.size(); i++) { HashMap<String, String> item = mAllData.get(i); if (item.get(JsonFragmentCategoriaCONN.TAG_NOME) .toLowerCase() .contains(constraint.toString().toLowerCase())) { newValues.add(item); } } results.values = newValues; results.count = newValues.size(); } return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { mDataShown = (ArrayList<HashMap<String, String>>) results.values; Log.d("CustomArrayAdapter", String.valueOf(results.values)); Log.d("CustomArrayAdapter", String.valueOf(results.count)); notifyDataSetChanged(); } } 
  • IllegalStateException: El contenido del adaptador ha cambiado pero ListView no recibió una notificación
  • ¿Cómo interceptar una intención de Google Maps en Android?
  • AutoCompleteTextView - deshabilitar el filtrado
  • Cómo filtrar ListView utilizando getFilter () en BaseAdapter
  • ¿En qué componentes de interfaz de usuario deben utilizarse los filtros y / o la clasificación?
  • Filtro ListView con CursorLoader Y FilterQueryProvider?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.