Просмотр списка фильтров Android

Я создал представление списка в android, и я хочу добавить текст редактирования над списком, и когда пользователь вводит текст, список будет отфильтрован в соответствии с пользовательским вводом

может ли кто-нибудь сказать мне, пожалуйста, если есть способ фильтровать адаптер списка в Android?

Да. Добавьте EditText поверх своего списка в его макетном файле aml. И в вашей деятельности / fragmentе.

lv = (ListView) findViewById(R.id.list_view); inputSearch = (EditText) findViewById(R.id.inputSearch); // Adding items to listview adapter = new ArrayAdapter(this, R.layout.list_item, R.id.product_name, products); lv.setAdapter(adapter); inputSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text MainActivity.this.adapter.getFilter().filter(cs); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void afterTextChanged(Editable arg0) {} }); 

Основным здесь является добавление OnTextChangeListener в текст редактирования и внутри метода обратного вызова применить фильтр к адаптеру listview.

РЕДАКТИРОВАТЬ

Чтобы получить фильтр в пользовательский BaseAdapter, вам потребуется реализовать интерфейс Filterable.

 class CustomAdapter extends BaseAdapter implements Filterable { public View getView(){ ... } public Integer getCount() { ... } @Override public Filter getFilter() { Filter filter = new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { arrayListNames = (List) results.values; notifyDataSetChanged(); } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); ArrayList FilteredArrayNames = new ArrayList(); // perform your search here using the searchConstraint String. constraint = constraint.toString().toLowerCase(); for (int i = 0; i < mDatabaseOfNames.size(); i++) { String dataNames = mDatabaseOfNames.get(i); if (dataNames.toLowerCase().startsWith(constraint.toString())) { FilteredArrayNames.add(dataNames); } } results.count = FilteredArrayNames.size(); results.values = FilteredArrayNames; Log.e("VALUES", results.values.toString()); return results; } }; return filter; } } 

Внутри perfromFiltering () вам нужно выполнить фактическое сравнение поискового запроса с значениями в вашей базе данных. Он передаст свой результат publishResults () .

Внедрите свой адаптер.

 public class vJournalAdapter extends ArrayAdapter implements Filterable{ private ArrayList items; private Context mContext; .... 

затем создайте свой class Filter:

 private class JournalFilter extends Filter{ @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults result = new FilterResults(); List allJournals = getAllJournals(); if(constraint == null || constraint.length() == 0){ result.values = allJournals; result.count = allJournals.size(); }else{ ArrayList filteredList = new ArrayList(); for(JournalModel j: allJournals){ if(j.source.title.contains(constraint)) filteredList.add(j); } result.values = filteredList; result.count = filteredList.size(); } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results.count == 0) { notifyDataSetInvalidated(); } else { items = (ArrayList) results.values; notifyDataSetChanged(); } } } 

таким образом, ваш адаптер Filterable, вы можете передать элемент фильтра в фильтр адаптера и выполнить работу. Надеюсь, это будет полезно.

В случае, если кто-то еще заинтересован в этом вопросе, я считаю, что лучший подход для фильтрации списков – создать общий class фильтра и использовать его с некоторыми базовыми методами отражения / обобщения, содержащимися в пакете SDK старой школы Java. Вот что я сделал:

 public class GenericListFilter extends Filter { /** * Copycat constructor * @param list the original list to be used */ public GenericListFilter (List list, String reflectMethodName, ArrayAdapter adapter) { super (); mInternalList = new ArrayList<>(list); mAdapterUsed = adapter; try { ParameterizedType stringListType = (ParameterizedType) getClass().getField("mInternalList").getGenericType(); mCompairMethod = stringListType.getActualTypeArguments()[0].getClass().getMethod(reflectMethodName); } catch (Exception ex) { Log.w("GenericListFilter", ex.getMessage(), ex); try { if (mInternalList.size() > 0) { T type = mInternalList.get(0); mCompairMethod = type.getClass().getMethod(reflectMethodName); } } catch (Exception e) { Log.e("GenericListFilter", e.getMessage(), e); } } } /** * Let's filter the data with the given constraint * @param constraint * @return */ @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); List filteredContents = new ArrayList<>(); if ( constraint.length() > 0 ) { try { for (T obj : mInternalList) { String result = (String) mCompairMethod.invoke(obj); if (result.toLowerCase().startsWith(constraint.toString().toLowerCase())) { filteredContents.add(obj); } } } catch (Exception ex) { Log.e("GenericListFilter", ex.getMessage(), ex); } } else { filteredContents.addAll(mInternalList); } results.values = filteredContents; results.count = filteredContents.size(); return results; } /** * Publish the filtering adapter list * @param constraint * @param results */ @Override protected void publishResults(CharSequence constraint, FilterResults results) { mAdapterUsed.clear(); mAdapterUsed.addAll((List) results.values); if ( results.count == 0 ) { mAdapterUsed.notifyDataSetInvalidated(); } else { mAdapterUsed.notifyDataSetChanged(); } } // class properties private ArrayAdapter mAdapterUsed; private List mInternalList; private Method mCompairMethod; } 

И после этого единственное, что вам нужно сделать, это создать фильтр в качестве classа-члена (возможно, в представлении «onCreate»), передав ссылку на ваш адаптер, ваш список и метод, который нужно вызвать для фильтрации:

 this.mFilter = new GenericFilter (list, "getName", adapter); 

Единственное, чего сейчас нет, это переопределить метод getFilter в classе адаптера:

 @Override public Filter getFilter () { return MyViewClass.this.mFilter; } 

Все сделано! Вы должны успешно отфильтровать свой список. Конечно, вы также должны реализовать алгоритм фильтра, который наилучшим образом описывает ваши потребности, а приведенный ниже код является лишь примером. , Надеюсь, это помогло, позаботьтесь.

  • Java8: сумма значений из определенного поля объектов в списке
  • Использование File.listFiles с FileNameExtensionFilter
  • Фильтр ListView с массивом
  • Как фильтровать массив из всех элементов другого массива
  • Каков наилучший способ фильтрации коллекции Java?
  • Запуск пользовательского приложения для Android от браузера android
  • Как использовать фильтр объектов с поддержкой softlayer api?
  • Почему изменение порядка стекирования зависит от зависания фильтра webkit?
  • Как создать RESTful поиск / фильтрацию?
  • Android - Внедрение поискового фильтра в RecyclerView
  • список по сравнению с lambda + filter
  • Давайте будем гением компьютера.