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(); } } }
- Cómo restablecer listview después de searchview se cierra en android?
- Android: Intento de filtro para un patrón Uri específico
- ¿Cómo excluir ciertos mensajes por el nombre de TAG utilizando Android adb logcat?
- Android ¿Cómo puedo sobrescribir el filtro para mi ArrayAdapter?
- Vista de búsqueda de Android en los datos de Firebase
- Índice de matriz de Android ListView fuera de límites después del filtro
- Filtrado personalizado en Android con ArrayAdapter
- ¿Cómo puedo usar filtro para emma cuando construyo una prueba de Android con hormigas?
- ListAdapter Filtro que no sea el uso de cadenas?
- Filtro ListView con arrayadapter
- Cómo implementar filtrado en RealmRecyclerViewAdapter
- Filtrado personalizado ArrayAdapter en ListView
- ¿Cómo anular el filtro en el ArrayAdapter de Android?
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(); } }