【问题标题】:Android Studio: How to add filter on a recyclerview and how to implement itAndroid Studio:如何在 recyclerview 上添加过滤器以及如何实现它
【发布时间】:2017-11-30 08:23:13
【问题描述】:
private class ValueFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            dbList = itemListCopy;

            if (constraint != null && constraint.length() > 0) {
                List<DbItemModel> filterList = new ArrayList();
                for (int i = 0; i < dbList.size(); i++) {
                    String str = (dbList.get(i).getItemDetails().toUpperCase()) + " " +
                            (dbList.get(i).getGroupName().toUpperCase()) + " " +
                            (dbList.get(i).getItemName().toUpperCase()) + " ";
                    if (str.contains(constraint.toString().toUpperCase())) {
                        filterList.add(dbList.get(i));
                    }
                }
                dbList = filterList;
                results.count = filterList.size();
                results.values = filterList;
            } else {
                results.count = itemListCopy.size();
                results.values = itemListCopy;
            }
            return results;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults results) {
            dbList = (List<DbItemModel>) results.values;
            notifyDataSetChanged();
        }
    }

我想在我的 recyclerview 上添加过滤器并将其用于搜索功能。请。帮助我,如果你能让它变得简单。谢谢大家。

【问题讨论】:

标签: java android


【解决方案1】:

第 1 步为您的适配器实现 Filterable 接口并实现其方法

例如:

 public class MyAdapter extends
    RecyclerView.Adapter<MyAdapter.ViewHolder> implements Filterable{
  // Other code 

   }

第二步创建一个扩展过滤器的类

例如:

private class ValueFilter extends Filter {

@Override
protected FilterResults performFiltering(CharSequence constraint) {
  FilterResults results = new FilterResults();
  contactList = contactsListCopy;
// Replace with your own logic 
  if (constraint != null && constraint.length() > 0) {
    List<Contacts> filterList = new ArrayList();
    for (int i = 0; i < contactList.size(); i++) {
      if ((contactList.get(i).getName().toUpperCase())
          .contains(constraint.toString().toUpperCase())) {
        filterList.add(contactList.get(i));
      }
    }
    contactList = filterList;
    results.count = filterList.size();
    results.values = filterList;
  } else {
    results.count = contactsListCopy.size();
    results.values = contactsListCopy;
  }
  return results;
}

@Override
protected void publishResults(CharSequence charSequence, FilterResults results) {
  contactList = (List<Contacts>) results.values;
  notifyDataSetChanged();
}

}

第3步:为简单起见添加

<android.support.v7.widget.SearchView
  android:id="@+id/search"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"/>

在回收站视图上方的片段/活动布局中

您的活动/片段中的第 4 步实现 SearchView.OnQueryTextListener 并初始化视图

 SearchView sv = (SearchView) itemView.findViewById(R.id.search);
 sv.setVisibility(View.VISIBLE);
 sv.setQueryHint("Search Here");
sv.setOnQueryTextListener(this);

第五步:实现所有方法

步骤 6 像这样更新适配器

      @Override
  public boolean onQueryTextSubmit(String query) {
    mAdapter.getFilter().filter(query);
    return true;
  }

  @Override
  public boolean onQueryTextChange(String newText) {
    mAdapter.getFilter().filter(newText);
    return true;
}

【讨论】:

  • 嗨。只想在我现有的活动中尝试您的代码。我想要一个位于操作栏菜单中的可折叠搜索按钮来对我的 recyclerview 进行搜索/过滤。它的代码是什么?
  • 抱歉问这个问题(因为我刚开始使用 android 和 java 编写代码),我应该在哪里放置/键入 ValueFilter 类?我应该创建一个新的 java 类文件吗?
  • 你只能在适配器类中解决这个问题
  • 请解释contactList和contactListCopy。我需要声明一些类吗?
  • 不,这只是我的过滤器的逻辑。你需要在那里有自己的实现
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2017-04-06
  • 2019-01-11
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多