android - 使用卡片在 RecyclerView 上添加搜索过滤器?

标签 android filter searchview android-recyclerview

我在 RecyclerView 上分别找到了 ListViewSearchView 上的过滤器解决方案,但我希望将它们结合起来。有没有可能?

最佳答案

是的,您的 RecyclerView.Adapter 可以实现 Filterable。之后你必须重写 Filter getFilter() 方法。

您必须定义自己的过滤器,如下面的代码所示:

@Override
public Filter getFilter() {
    return new 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 - (f.e. set in in adapter list)
        }
}

示例

public class UserListAdapter extends RecyclerView.Adapter<UserListAdapter.ViewHolder> implements Filterable {

    private final List<User> userList;

    private final List<User> 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<User> originalList;

        private final List<User> filteredList;

        private UserFilter(UserListAdapter adapter, List<User> 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<User>) results.values);
            adapter.notifyDataSetChanged();
        }
    }
}

之后在你想过滤调用的地方:

userListAdapter.getFilter().filter(text)

关于android - 使用卡片在 RecyclerView 上添加搜索过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29792187/

相关文章:

Android 使用自定义数组适配器

android - 覆盖 webview 中的视口(viewport)元数据属性 "user-scalable=no"以允许缩放

javascript - 如何使用广播接收器从 smsmanager (nativescript) 获取发送的 Intent

VBA Excel : filter with "or" condtion between 2 columns

javascript - 使用无限滚动过滤项目

java - 使用 Firebase 实时数据库的 SearchView 需要很长时间才能提供结果,而且价格昂贵

android - SearchView(不在工具栏中)如何显示全屏下拉列表

android - solo.searchButton 总是返回 true (Android 2.3.6 with robotium)

android - 如何用android在表格中显示MySQL数据

ios - 如何从第一个索引过滤字符串数组而不是包含字符?