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


猜你喜欢
- 概念JavaBean在实际编程中,我们常常需要一些用来包装值对象的类,例如Student、 Employee、Order,这些 类中往往没有
- 本文实例为大家分享了JAVA NIO实现简单聊天室功能的具体代码,供大家参考,具体内容如下服务端初始化一个ServerSocketChann
- 目录概览问题一原因解决办法问题二原因解决办法概览在当下几乎所有的公司都采用了前后端分离的开发模式,Swagger作为了在API在线文档工具,
- 前言作为一个开发者,日常会接触到很多优秀的软件,其实,或多或少会有这样的想法,我能不能开发一个自己软件,甚至办公软件都希望是Markdown
- 今天有位同事在使用System.err和System.out遇上了一些小问题.看了些资料总结下:1.JDK文档对两者的解释:out:“标准”
- 前言安卓开发中一个很基础的操作就是打开一个 Activity ,另一个很必要的操作就是,打开一个 Activity ,在打开的 Activi
- 本文实例讲述了Android开发之获取LayoutInflater对象的方法。分享给大家供大家参考,具体如下:在写Android程序时,有时
- 写在前面:今天用保存QQ账号和密码的实战演练,带大家掌握Android存储中最基本的文件存储方式文件存储是Android中最基本的一种数据存
- 1、什么是Mybatis?MyBatis是一个优秀的持久层框架,是一个半ORM(对象关系映射)框架,它对jdbc的操作数据库的过程进行封装,
- 这个问题是我自己开发中遇到的问题 数据库使用的是mysql5.6 字段名称为checkingTime 类
- Volley简介我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发
- 1. Spring Boot 入门 Spring Boot是Spring社区较新的一个项目。该项目的目的是帮助开发者更容易的创建基于Spri
- 前言记得几年前有一次栈长去面试,问到了这么一个问题:Java中的对象都是在堆中分配吗?说明为什么!当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤
- Android使用RecyclerView1. 什么是RecyclerViewRecyclerView 是 Android-support-
- 先看看电影票在线选座功能实现的效果图:界面比较粗糙,主要看原理。这个界面主要包括以下几部分1、座位 2、左边的排数 3、左上方的缩略图 4、
- 配置基础的定时任务最基本的配置方法,而且这样配置定时任务是单线程串行执行的,也就是说每次只能有一个定时任务可以执行,可以试着声明两个方法,在
- 使用TransitionDrawable渐变切换多张图片,供大家参考,具体内容如下1、定义变量private int change = 0;
- 本文实例讲述了Android自定义个性化的Dialog。分享给大家供大家参考,具体如下:Dialog:mDialog = new Dialo
- 核心配置文件mybatis-config.xml 系统核心配置文件MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属
- private string HttpPost(string Url, string postDataStr)