Android RecyclerView添加搜索过滤器的示例代码
作者:人言落日是天涯 发布时间:2022-03-08 21:44:49
标签:Android,搜索,过滤器
搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的。下面给大家提供一种过滤列表的方法。
老规矩,先上图
RecycleView搜索过滤器-getFilter()
Android 提供了Fileterable类,可以通过过滤器(条件)来过滤数据。通常,getFilter()方法必须在提供过滤条件的适配器类中被重写,以通过列表进行搜索。下面是通过getFilter(),来过滤数据。
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilterList = mSourceList;
} else {
List<String> filteredList = new ArrayList<>();
for (String str : mSourceList) {
//这里根据需求,添加匹配规则
if (str.contains(charString)) {
filteredList.add(str);
}
}
mFilterList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilterList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilterList = (ArrayList<String>) filterResults.values;
//刷新数据
notifyDataSetChanged();
}
};
}
完整Adapter代码:
//这里实现Filterable接口
class TitleAdapter extends RecyclerView.Adapter<TitleAdapter.TitleHolder> implements Filterable {
private List<String> mSourceList = new ArrayList<>();
private List<String> mFilterList = new ArrayList<>();
private void appendList(List<String> list) {
mSourceList = list;
//这里需要初始化filterList
mFilterList = list;
}
@Override
public TitleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new TitleHolder(LayoutInflater.from(FastScrollRecyclerActivity.this).inflate(R.layout.item_textview_view, parent, false));
}
@Override
public void onBindViewHolder(TitleHolder holder, int position) {
//这里也是过滤后的list
holder.tv.setText(mFilterList.get(position));
}
@Override
public int getItemCount() {
//注意这里需要是过滤后的list
return mFilterList.size();
}
//重写getFilter()方法
@Override
public Filter getFilter() {
return new Filter() {
//执行过滤操作
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
//没有过滤的内容,则使用源数据
mFilterList = mSourceList;
} else {
List<String> filteredList = new ArrayList<>();
for (String str : mSourceList) {
//这里根据需求,添加匹配规则
if (str.contains(charString)) {
filteredList.add(str);
}
}
mFilterList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilterList;
return filterResults;
}
//把过滤后的值返回出来
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilterList = (ArrayList<String>) filterResults.values;
notifyDataSetChanged();
}
};
}
class TitleHolder extends RecyclerView.ViewHolder {
TextView tv;
public TitleHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.id_tv_test);
}
}
}
数据初始化部分
private String[] str = new String[]{
"apple", "apple juice", "apple pie", "abalone", "bread", "brandy", "Blueberry", "Banana", "chocolate", "cake", "chicken", "cheese", "Durian",
"Dim Sam", "Dumpling", "duck", "egg", "English muffin", "eggplant", "French toast", "fish", "fig", "fruit"
};
private List<String> mList = new ArrayList<>();
private void initList() {
for (int i = 0; i < str.length; i++) {
mList.add(str[i]);
}
}
设置RecycleView和EditText监听
RecyclerView rv = (RecyclerView) findViewById(R.id.id_rv);
LinearLayoutManager manager = new LinearLayoutManager(this);
rv.setLayoutManager(manager);
final TitleAdapter adapter = new TitleAdapter();
adapter.appendList(mList);
rv.setAdapter(adapter);
EditText et = findViewById(R.id.id_et);
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence sequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence sequence, int i, int i1, int i2) {
adapter.getFilter().filter(sequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
来源:https://www.jianshu.com/p/04a2e42a732e
0
投稿
猜你喜欢
- 一、创建字符串创建字符串的方式有很多种,当是常见的一般就三种1. 直接赋值(常用)String str = "hello worl
- 本文实例讲述了C#使用smtp发送带附件的邮件实现方法。可直接将string类型结果保存为附件。分享给大家供大家参考。具体分析如下:该方式直
- 前言Hello!上一期我大致讲解了关于Collection单列集合以及它的子接口List集合的概述、特点和遍历等,今天我为大家讲解关于Col
- 首先下载newtonsoft.json,增加引用using newtonsoft.json.linq;把jobject的内容提取出来,job
- 实现的功能比较简单,就是随机产生了四个字符然后输出。效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介
- 本文实例讲述了C#实现在启动目录创建快捷方式的方法。分享给大家供大家参考。具体如下:添加引用,选择 COM 选项卡并选择 Windows S
- 一、饿汉式单例类public class Singleton { privat
- 一、 * 概念 * 分为JDK * 和cglib * 两种方式。jdk * 是由Java内部的反射机制来实现的,cglib *
- 1.WinMergeWinMerge是一款运行于Windows系统下的文件比较和合并工具https://winmerge.org/downl
- 本文实例讲述了C#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:首先,定义一个水果抽象类,代码如下:class Fruit{
- 目录1. 结论先出JSR 380Valid VS Validated 不同点?Validator2. @Valid和@Validated 注
- 本文实例讲述了Java+Ajax实现的用户名重复检验功能。分享给大家供大家参考,具体如下:今天,我来教大家怎么实现Java+Ajax实现用户
- 这次我们来说一下hibernate的层次设计,层次设计也就是实体之间的继承关系的设计。 也许这样比较抽象,我们直接看例子。&nbs
- 这篇文章主要介绍了Spring Boot Debug调试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 介绍Dubbo 是一款高性能、轻量级的 Java RPC 框架,由阿里巴巴开源并贡献至 Apache 基金会。它能够提供服务的注册与发现、负
- Device Administration对于这个应用,市场上很多,但是看一下评论就知道效果有多差了,因为99%一键锁屏应用没办法卸载。今天
- 前言:本文源码基于spring-framework-5.3.10。mvc是spring源码中的一个子模块!一、RequestMappingH
- 已知一副扑克牌有54张,去除大王和小王,剩余52张。在其中随机抽取4张牌,利用加减乘除进行计算得到24. 从A到10,他们的值分别为1到10
- 1、说明向上转型就是把一个子类引用给一个父类引用,也就是父类引用 引用了子类的对象,即父类 父类对象 = 子类实例。此时通过父类引用变量调用
- 前言我们在前面介绍AssignAnalyzer时,对AssignAnalyzer.letInit(DiagnosticPosition, V