Android RecyclerView添加搜索过滤器的示例代码

搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的。下面给大家提供一种过滤列表的方法。

老规矩,先上图

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) {

   }
  });

好了,到这里就结束了��。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android中RecyclerView实现横向滑动代码

    RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.本文给大家介绍Android中RecyclerView实现横向滑动代码,一起看看吧. android.support.v7.widget.RecyclerView 功能:RecyclerView横向滑动 控件:<android.support.v7.widget.RecyclerView /> Java类:RecyclerView.GalleryAdap

  • Android项目实战之仿网易新闻的页面(RecyclerView )

    本文实例实现一个仿网易新闻的页面,上面是轮播的图片,下面是 RecyclerView 显示新闻列表,具体内容如下 错误方法 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...> <ViewPager ... /> <android.support.v7.widget.RecyclerView .../> </LinearLayout> 这样布局

  • Android中RecyclerView实现多级折叠列表效果(二)

    前言 在本文开始之前请大家先看一下这篇文章:http://www.jb51.net/article/113510.htm 上面的这篇文章是之前写的,里面发现有很多不好用地方,也学到些新姿势,改动了许多地方.下面来看看详细的介绍: 要点: 1.可以通过后台控制Item的展示. 2.TreeRecyclerAdapter,可以展开,折叠.多级展示 3.adapter可以使用装饰者模式进行扩展.支持EmptyAdapter.可以添加headview和footview 4.item的样式可以编写文档,t

  • Android中RecyclerView布局代替GridView实现类似支付宝的界面

    单纯使用GridView 通用的两种给GridView 添加分割线的方法:http://stackoverflow.com/questions/7132030/android-gridview-draw-dividers 给Gridview 添加分割线,也就是实现网格布局,不清楚谷歌为什么没有给Gridview 添加一个类似 ListView 的Divider 属性,因此就需要我们自己去添加分割线, 目前两种方法,第一种是 利用GridView 的  android:horizontalSpac

  • Android中使用RecyclerView实现下拉刷新和上拉加载

    推荐阅读:使用RecyclerView添加Header和Footer的方法                       RecyclerView的使用之HelloWorld RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.本文给大家介绍如何为RecyclerView添加下拉刷新和上拉加载,过去在ListView当中添加下拉刷新和上拉加载是非常方便的利用addHeaderView和addFooterVie

  • Android RecyclerView网格布局(支持多种分割线)详解(2)

    上篇Android RecyclerView 详解(1)-线性布局 记录了下RecyclerView的使用方法,并且讲述了线性布局列表的使用方法,在此基础上加上了万能分割线,支持颜色分割线和图片分割线,同时支持对分割线设置线宽. 这篇是总结一下网格布局的使用,同样也支持两种分割线和线宽的设置. 主要的相关类: 1. RecyclerView.Adapter 2. GridLayoutManager 网格布局管理器 3. RecycleView.ItemDecoration 分割线 下面就直接通过

  • Android RecyclerView实现下拉刷新和上拉加载

    RecyclerView已经出来很久了,许许多多的项目都开始从ListView转战RecyclerView,那么,上拉加载和下拉刷新是一件很有必要的事情. 在ListView上,我们可以通过自己添加addHeadView和addFootView去添加头布局和底部局实现自定义的上拉和下拉,或者使用一些第三方库来简单的集成,例如Android-pulltorefresh或者android-Ultra-Pull-to-Refresh,后者的自定义更强,但需要自己实现上拉加载. 而在下面我们将用两种方式

  • Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法

    RecyclerView 已经出来很久了,但是在项目中之前都使用的是ListView,最近新的项目上了都大量的使用了RecycleView.尤其是瀑布流的下拉刷新,网上吧啦吧啦没有合适的自己总结了一哈. 先贴图上来看看: 使用RecyclerView实现上拉加载更多和下拉刷新的功能我自己有两种方式: 1.使用系统自带的Android.support.v4.widget.SwipeRefreshLayout这个控价来实现. 2.自定义的里面带有RecyleView的控件. 使用RecycleVie

  • Android中RecyclerView嵌套滑动冲突解决的代码片段

    在纵向RecyclerView嵌套横向RecyclerView时,如果纵向RecyclerView有下拉刷新功能,那么内部的横向RecyclerView的横向滑动体验会很差.(只有纯横向滑动时,才能滑动内部的横向RecyclerView,否则滑动事件就会影响到下拉刷新),添加拦截判断. public class MySwipeRefreshLayout extends SwipeRefreshLayout { private boolean mIsVpDragger; private final

  • Android RecyclerView添加搜索过滤器的示例代码

    搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的.下面给大家提供一种过滤列表的方法. 老规矩,先上图 RecycleView搜索过滤器-getFilter() Android 提供了Fileterable类,可以通过过滤器(条件)来过滤数据.通常,getFilter()方法必须在提供过滤条件的适配器类中被重写,以通过列表进行搜索.下面是通过getFilter(),来过滤数据. @Override public Filter getFilter() { return new Filter

  • Android RecyclerView 实现快速滚动的示例代码

    简评:Android Support Library 26 中终于实现了一个等待已久的功能: RecyclerView 的快速滚动 . Android 官方早就在建议开发者使用 RecyclerView 替代 ListView,RecyclerView 也确实表现要好于 ListView,除了没有快速滚动,就像下面这样: 因此,之前要想在 RecyclerView 上实现快速滚动,往往是依赖第三方库,比如:FutureMind/recycler-fast-scroll或 timusus/Recy

  • Android中TabLayout添加小红点的示例代码

    本文介绍了Android中TabLayout添加小红点的示例代码,分享给大家,具体如下 安卓原生的android.support.design.widget.TabLayout,配合ViewPager已经很好用了,但是有时我们会在内容更新时,在tab标题右上方加上一个红点等标记此tab内容有更新时,就需要给原生的TabLayout设置你定义的布局,用法和原生的一样,只是在代码中设置一下TabLayout的布局. 1.主布局文件 <?xml version="1.0" encodi

  • Android视频悬浮窗口实现的示例代码

    前言 本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示: 悬浮窗口.gif 原理 WindowManager 对 View 视图进行添加.移除.更新处理: WindowManager.LayoutParams 对窗口参数进行一系列设置. 实现 首先,需要添加相对应悬浮窗权限: <uses-permission android:name="android.permission.SYSTEM_A

  • Android输入框实时模糊搜索效果的示例代码

    Android输入框实时模糊搜索 很多开发场景会用到搜索框实时模糊搜索来帮助用户输入内容,如图 思路是在EditText 字符变动的时候 弹出ListPopupwindow并更新列表,这样的做法google已经封装为AutoCompleteTextView 用法 mAutoCompleteTextView.setAdapter(adapter); mAutoCompleteTextView.setFocusable(true); mAutoCompleteTextView.setOnItemCl

  • IntelliJ Plugin 开发之添加第三方jar的示例代码

    本小节内容不多,但是个人感觉比较独立,还是拿出来单讲吧. 在开发 IntelliJ Plugin 时,如果需要用到 Gson.OKHttp 等第三方库时,该怎么办呢? 回答这个问题前,我先补充前面没有讲到的内容. 插件开发其实可以使用两种方式,官方文档:http://www.jetbrains.org/intellij/sdk/docs/tutorials/build_system.html 1.Using Gradle 2.Using DevKit 本系列文章讲的就是 DevKit 方式插件开

  • Android实现绘制LocationMarkerView图的示例代码

    目录 LocationMarkerView图的绘制 绘制整公里的文字 添加动画 LocationMarker是运动轨迹上Start.End, 以及整公里点上笔者自定义绘制的一个MarkerView, 当时之所以没有用设计给的icon是这个MarkerView里需要填充动态的数字,自定义的话自主性比较大些也方面做动画,之前的Android 传统自定义View的实现可以看这篇文章介绍 运动App自定义LocationMarker. 这里先看下gif动图: LocationMarkerView图的绘制

  • Android自定义控件之翻转按钮的示例代码

    本文介绍了Android自定义控件之翻转按钮的示例代码,分享给大家,具体如下: 先看一下效果 一.先定义控件的基本结构 这里我们定义一个容器,所以是在ViewGroup的基础上扩展. 简单起见,直接使用扩展自ViewGroup的LinearLayout,并将我们的控件扩展自LinearLayout. 1.按钮的基本布局如下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr

  • Android实现强制下线功能的示例代码

    一.回顾 上次连载写了两个类,一个类ActivityCollector.java用于管理所有的活动:一个类是BaseActivity.java作为所有活动的父类: 还有一个放在layout目录中的登录界面login.xml 二.登录页面的活动 接下来写一个登录页面的活动,继承自BaseActivity.java package com.example.broadcastbestpractice; import android.content.Intent; import android.os.B

  • Android未读消息拖动气泡示例代码详解(附源码)

    前言 拖动清除未读消息可以说在很多应用中都很常见,也被用户广泛接受.本文是一个可以供参考的Demo,希望能有帮助. 提示:以下是本篇文章正文内容,下面案例可供参考 最终效果图及思路 实现关键: 气泡中间的两条边,分别是以ab,cd为数据点,G为控制点的贝塞尔曲线. 步骤: 绘制圆背景以及文本:连接情况绘制贝塞尔曲线:另外端点绘制一个圆 关键代码 1.定义,初始化等 状态:静止.连接.分离.消失 在onSizeChanged中初始化状态,固定气泡以及可动气泡的圆心 代码如下(示例): @Overr

随机推荐