Android RecyclerView添加搜索过滤器的示例代码
作者:人言落日是天涯 时间:2022-03-08 21:44:49
搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的。下面给大家提供一种过滤列表的方法。
老规矩,先上图
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
标签:Android,搜索,过滤器
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java实习--每天打卡十道面试题!
2021-12-06 15:22:19
![](https://img.aspxhome.com/file/2023/2/85522_0s.png)
Spring gateway + Oauth2实现单点登录及详细配置
2022-12-19 00:16:49
![](https://img.aspxhome.com/file/2023/2/70942_0s.png)
通过Java实现文件断点续传功能
2022-06-22 16:30:42
![](https://img.aspxhome.com/file/2023/0/80830_0s.png)
base64_encode和base64_decode的JAVA实现
2023-08-25 07:56:49
Mybatis RowBounds 限制查询条数的实现代码
2022-11-18 17:26:03
Java 容器类源码详解 Set
2022-03-21 18:08:40
Mybatis插件之自动生成不使用默认的驼峰式操作
2023-11-19 01:20:03
C#实现动态执行字符串脚本(优化版)的示例代码
2022-06-10 19:13:54
C#创建Excel多级分组的方法
2022-03-21 15:20:34
![](https://img.aspxhome.com/file/2023/5/81045_0s.jpg)
详解springboot之jackson的两种配置方式
2021-11-03 11:01:21
Java实现将类数据逐行写入CSV文件的方法详解
2023-02-27 17:11:11
SpringBoot登录验证码实现过程详解
2023-04-26 12:24:05
![](https://img.aspxhome.com/file/2023/1/64941_0s.png)
解析spring cloud ouath2中的Eureka
2023-10-12 04:07:54
![](https://img.aspxhome.com/file/2023/6/61006_0s.png)
java实现图片分割指定大小
2021-07-02 16:56:34
解决spring mvc 多数据源切换,不支持事务控制的问题
2022-09-30 03:39:56
cmd中javac和java使用及注意事项详解
2022-03-25 10:37:36
![](https://img.aspxhome.com/file/2023/5/101925_0s.png)
Unity3D动态对象优化代码分享
2023-12-22 09:38:24
java selenium元素定位大全
2023-10-23 01:07:42
![](https://img.aspxhome.com/file/2023/3/68503_0s.png)
Android可筛选的弹窗控件CustomFiltControl
2023-01-21 09:01:46
![](https://img.aspxhome.com/file/2023/8/94248_0s.jpg)
Java动态规划之硬币找零问题实现代码
2023-01-23 20:37:38