Добавить фильтр на RecyclerView с карточками?

Я нашел решения для фильтров в ListView и SearchView на RecyclerView отдельно, но я хочу их объединить. Возможно ли это?

Да, возможно, ваш RecyclerView.Adapter может реализовать Filterable . После этого вам необходимо переопределить метод Filter getFilter() .

Вы должны определить свой собственный фильтр, как показано в приведенном ниже коде:

 @Override public Filter getFilter() { return new YourFilterClass(); } 

YourFilterClass

 class YourFilterClass extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { //Here you have to implement filtering way final FilterResults results = new FilterResults(); //logic to filtering results.values = ... results.count = ... return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { // here you can use result - (fe set in in adapter list) } } 

пример

 public class UserListAdapter extends RecyclerView.Adapter implements Filterable { private final List userList; private final List filteredUserList; private UserFilter userFilter; public UserListAdapter(Context context) { this.userList =new ArrayList<>(); this.filteredUserList = new ArrayList<>(); } ///... other methods @Override public Filter getFilter() { if(userFilter == null) userFilter = new UserFilter(this, userList); return userFilter; } private static class UserFilter extends Filter { private final UserListAdapter adapter; private final List originalList; private final List filteredList; private UserFilter(UserListAdapter adapter, List originalList) { super(); this.adapter = adapter; this.originalList = new LinkedList<>(originalList); this.filteredList = new ArrayList<>(); } @Override protected FilterResults performFiltering(CharSequence constraint) { filteredList.clear(); final FilterResults results = new FilterResults(); if (constraint.length() == 0) { filteredList.addAll(originalList); } else { final String filterPattern = constraint.toString().toLowerCase().trim(); for (final User user : originalList) { if (user.getName().contains(filterPattern)) { filteredList.add(user); } } } results.values = filteredList; results.count = filteredList.size(); return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { adapter.filteredUserList.clear(); adapter.filteredUserList.addAll((ArrayList) results.values); adapter.notifyDataSetChanged(); } } } 

После этого в том месте, где вы хотите отфильтровать вызов:

 userListAdapter.getFilter().filter(text) 

Внутри Fragment Class заявляют, что:

 protected List mDataset; protected List mDataOrigin; 

то внутри onCreate добавьте то же исходное назначение как для dataSet ant dataOrigin

 mDataset = getObjectsFromDB(); mDataOrigin = getObjectsFromDB(); 

Наконец, используйте магическую функцию:

 private void filterRecyclerView(String charText){ charText = charText.toLowerCase(); clearDataSet(); if (charText.length() == 0) { mDataset.addAll(mDataOrigin); } else { for (User user : mDataOrigin) { if (user.getName().toLowerCase().contains(charText)) { mDataset.add(user); } } } mAdapter.notifyDataSetChanged(); } 

Уведомление User – это содержимое списка, которое вы можете заменить своим объектом, получайте удовольствие 🙂

Вот полный пример кода

Модельный class

 public class Skills { int id; String skill; boolean isSelected; public boolean isSelected() { return isSelected; } public void setSelected(boolean selected) { isSelected = selected; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSkill() { return skill; } public void setSkill(String skill) { this.skill = skill; } } 

Класс адаптера

 private static final String TAG = SkillAdapter.class.getSimpleName(); protected List mOriginalData = new ArrayList<>(); protected List mResultData = new ArrayList<>(); protected Activity mActivity; OnRecyclerViewClick onRecyclerViewClick; private ItemFilter mFilter = new ItemFilter(); public SkillAdapter(Activity activity, OnRecyclerViewClick onRecyclerViewClick) { mActivity = activity; this.onRecyclerViewClick = onRecyclerViewClick; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_skill, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { final Skills data = mResultData.get(position); try { final ViewHolder viewHolder = (ViewHolder) holder; if (data != null) { viewHolder.checkSkill.setText(data.getSkill()); viewHolder.checkSkill.setChecked(data.isSelected()); } } catch (Exception e) { e.printStackTrace(); } } @Override public int getItemCount() { return mResultData.size(); } public void addItem(Skills exam) { mOriginalData.add(exam); mResultData.add(exam); int index = mOriginalData.indexOf(exam); notifyItemInserted(index); } public void removeItem(int index) { mOriginalData.remove(index); notifyItemRemoved(index); } public void removeItem(Skills exam) { int index = mOriginalData.indexOf(exam); mOriginalData.remove(exam); notifyItemRemoved(index); } public Filter getFilter() { return mFilter; } public Skills getItem(int index) { return mOriginalData.get(index); } public void replaceItem(int index, Skills audioMeta) { mOriginalData.set(index, audioMeta); notifyItemChanged(index); } public class ViewHolder extends RecyclerView.ViewHolder { CheckBox checkSkill; public ViewHolder(View itemView) { super(itemView); checkSkill = (CheckBox) itemView.findViewById(R.id.chkSkill); checkSkill.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onRecyclerViewClick.onItemClick(v, getLayoutPosition()); } }); } } private class ItemFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { String filterString = constraint.toString().toLowerCase(); FilterResults results = new FilterResults(); int count = mOriginalData.size(); final ArrayList tempFilterList = new ArrayList(count); String filterableString; for (int i = 0; i < count; i++) { filterableString = mOriginalData.get(i).getSkill(); if (filterableString.toLowerCase().contains(filterString)) { tempFilterList.add(mOriginalData.get(i)); } } results.values = tempFilterList; results.count = tempFilterList.size(); return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { mResultData.clear(); mResultData = (ArrayList) results.values; notifyDataSetChanged(); } } 

Использование активности

  mAdapter = new SkillAdapter(SkillsActivity.this, SkillsActivity.this); recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); recyclerView.setAdapter(mAdapter); 

Затем фильтр

 editSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { mAdapter.getFilter().filter(editSearch.getText().toString()); } }); 
  • Как написать специальный фильтр в весенней безопасности?
  • Добавить признанное изображение в элементы wp_nav_menu
  • Как фильтровать данные jqGrid НЕ используя встроенный блок поиска / фильтра
  • Java8: сумма значений из определенного поля объектов в списке
  • Почему изменение порядка стекирования зависит от зависания фильтра webkit?
  • Как создать RESTful поиск / фильтрацию?
  • Как использовать фильтр объектов с поддержкой softlayer api?
  • ExtJs - Фильтрация сетки с полем поиска в заголовке столбца
  • Как исключить определенные сообщения по имени TAG с помощью Android adb logcat?
  • Как фильтровать возвращаемые данные из jQuery.ajax ()?
  • В Excel VBA, как мне сохранить / восстановить определяемый пользователем фильтр?
  • Interesting Posts

    Почему я не могу написать строковый литерал, в то время как я * могу * написать строковый объект?

    Почему C # не использует арифметическую проверку переполнения по умолчанию?

    Каков видеоформат для архивирования видео для длительного хранения?

    Объединение: not () селекторов в CSS

    Как я могу печатать под именем пользователя, отличным от того, с кем я вошел? Как?

    Почему не является массивом общего типа?

    Как я могу реализовать счетчик ABA с C ++ 11 CAS?

    Как поддерживать несколько слоев ImageViews и сохранять их соотношение сторон на основе самого большого?

    Как получить URL-адрес с веб-сайта с помощью Java?

    как разрешить циклическую зависимость maven

    Вычисление разницы во времени hh: mm: ss format

    Как принять файл POST

    Как кодировать и декодировать строку base64?

    c # Когда мне следует использовать List и когда я должен использовать arraylist?

    Получить обложку с помощью Spotify API

    Давайте будем гением компьютера.