方法二:android:textFilterEnabled="true" + Filter

这个属性在android.widget.AbsListView下,要求adapter必须实现Filterable接口

参考: http://justcallmebrian.com/?p=149

实现步骤:

1.listview
布局文件中设置android:textFilterEnabled="true"
或代码中listview.setTextFilterEnabled(true);

2.adapter实现Filterable接口
Filterable接口很简单,就只有一个方法

这里要求返回一个Filter对象。
Filter是一个抽象类,需要自己写个类MyFilter,重写其中的方法

performFiltering方法,将用户输入的条件传过来,在这个方法中可以按照自己需要的条件过滤
publishResults中可以将过滤后的新数据传给adapter(通过一个全局变量 或者自己定义一个变量,提供get方法)

重写了上述两个方法后,外部可以通过adapter.getFilter().filter(s)完成过滤

另外,Filter还有一个内部类和一个内部接口

Filter.FilterListener中有一个onFilterComplete方法

Filter.FilterResults中有两个成员变量,用于存储过滤时的值

例: 实现MyFilter

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
private class MyFilter extends Filter{

    @Override
protected FilterResults performFiltering(CharSequence constraint) { //存储过滤的值
FilterResults retval = new FilterResults();
retval.values = list_data;
retval.count = list_data.size(); //有筛选条件时,显示被筛选的内容; 没有筛选条件时,显示所有内容
if(constraint != null && constraint.toString().length() > 0) { constraint = constraint.toString().toUpperCase();
List<Map<String, String>> filt = new ArrayList<Map<String, String>>();
List<Map<String, String>> tmpItems = new ArrayList<Map<String, String>>();
tmpItems.addAll(origin_items);
for(int i = 0; i < tmpItems.size(); i++) { Map<String, String> sf = tmpItems.get(i);
if( sf.get("cid").toUpperCase().contains(constraint)
|| sf.get("type").toUpperCase().contains(constraint)
|| sf.get("title").toUpperCase().contains(constraint)
|| sf.get("answer").toUpperCase().contains(constraint)) { filt.add(sf); } }
retval.count = filt.size();
retval.values = filt; }
return retval; } @Override
protected void publishResults(CharSequence constraint, FilterResults results) { //先清空旧数据
filteredItems.clear();
adapter.notifyDataSetChanged(); //再添加新数据
filteredItems.addAll((List<Map<String, String>>)results.values);
adapter.notifyDataSetChanged();
} } }

例: 实现Filterable接口

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyAdapter extends BaseAdapter implements Filterable{
private MyFilter filter;
private List<Map<String, String>> filteredItems = new ArrayList<Map<String, String>>(); public View getView(int position, View convertView, ViewGroup parent) {
//操作filteredItems
} @Override public Filter getFilter() { if(filter == null){ filter = new MyFilter(); }
return filter; } }

注意: 这里我犯了一个比较严重的错误

关于过滤后的数据filteredItems的存储,我原来是直接

1
 filteredItems = (List<Map<String, String>>)results.values;

adapter中的绑定数据的方法也是直接用"="

1
2
3
4
5
6
  public void setData(List<Map<String, String>> list){

        this.filteredItems = list;
this.notifyDataSetChanged(); }

因为我希望筛选的时候,如果条件为空,还是要把原来所有的数据都显示出来。
然而使用" = " 这个写法其实是将引用指给了我最原始的数据,前后虽然有2个变量,但是指向的是同一个空间。
那么,当我publishResults时,会先清空旧数据,一旦清空,我的数据就会被我清掉,再也找不回来。

解决办法:
后来,我声明时直接给它实例化、分配了新空间。
使用时统一使用addAll方法,这样就相当于把数据复制一份出来,对复制的数据进行清空。
那么我每一次筛选条件为空时,还是可以取到原始的所有数据,显示出来。

效果图:

Android ListView快速定位(二)的更多相关文章

  1. Android ListView快速定位(三)

    方法三: android:fastScrollEnabled="true" 这个很简单,只要把属性设置了,就可以起作用了 不过这个滑块比较丑,当然网上也有自定义图片的例子. 参考 ...

  2. Android ListView快速定位(四)

    方法四: 添加一个EditText,作为搜索框 + Filter 其实这个不算第四个方法,因为与第二个一样,主要是实现Filter. 但是对于EditText的监听,我以前也没有写过,所以也记录一下. ...

  3. Android ListView快速定位(一)

    方法一: SectionIndexer接口 + 索引列表 参考:http://www.apkbus.com/android-69999-1-1.html 所谓section 就是一组有共性的item, ...

  4. Android apk快速定位、灰色按钮克星--DroidSword

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80994434 在进行Android应用程序的逆向分析时,经常需要对Android ...

  5. [Android Studio] Android Studio快速定位当前打开的文件在哪个目录(package)下

    转载自:http://blog.csdn.net/hyr83960944/article/details/38067499 在Eclipse中有一个很好的功能,就是比如我打开一个AActivity,左 ...

  6. [Android Studio] Android Studio快速定位当前打开的文件在哪个目录(package)下

    转载自:http://blog.csdn.net/hyr83960944/article/details/38067499 在Eclipse中有一个很好的功能,就是比如我打开一个AActivity,左 ...

  7. Android ListView 之 SimpleAdapter 二 (包含 item 中按钮监听)

    1    MainActivity.java package com.myadapter; import java.util.ArrayList; import java.util.HashMap; ...

  8. 快速定位 Android APP 当前页面的三种方法(Activity / Fragment)

    方法一.通过adb命令打印当前页面: Android 如何快速定位当前页面是哪个Activity or Fragment (1)查看当前Activity :adb shell "dumpsy ...

  9. Android ListView A~Z快速索引(改进版)

    上一篇文章虽然实现了ListView 快速索引的效果,但是有一个小小的Bug.这个Bug我在前面也说了,这篇文章就来解决这个Bug. 我研究的时候发现只要showBg值为true,中间的字母就显示,而 ...

随机推荐

  1. UVa 11082 (网络流建模) Matrix Decompressing

    网络流不难写,难的建一个能解决问题的模型.. 即使我知道这是网络流专题的题目,也绝不会能想出这种解法,=_=|| 题意: 给出一个矩阵的 前i行和 以及 前i列和,然后找到一个满足要求的矩阵,而且每个 ...

  2. [swustoj 1021] Submissions of online judge

    Submissions of online judge(1021) 问题描述 An online judge is a system to test programs in programming c ...

  3. 深入分析Cookie的安全性问题

    Cookie的目的是为用户带来方便,为网站带来增值,一般情况下不会造成严重的安全威胁.Cookie文件不能作为代码执行,也不会传送病毒,它为用户所专有并只能由创建它的服务器来读取.另外,浏览器一般只允 ...

  4. 批量产生ssh2项目中hibernate带注解的pojo类的快捷方法

    近几个月一直在忙于项目组的ios应用项目的开发,没有太多时间去研究web应用方面的问题了.刚好,昨天有网友问到如何批量产生hibernate带注解的pojo类的快捷方法,所谓批量就是指将当前数据库中所 ...

  5. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.5

    Suppose it is known that $\scrM$ is an invariant subspace for $A$. What invariant subspaces for $A\o ...

  6. Tomcat安全

    一.版本安全 升级当前的tomcat版本为最新稳定版本.故名思议,最新稳定版本就要兼顾最新和稳定这两个概念.一个稳定的版本,是需要时间沉淀的,而最新又是相对于稳定版而言的最新.因此我们一般会选择当前大 ...

  7. 算法 后减前最大值,zt

    一个人知道未来n天的每天股票的价格,请你给出一个算法,使得这个人从哪天买入,哪天卖出能获得最大的收益. 问题实际上就是求一个数组后面元素减前面元素的最大值 #include <stdio.h&g ...

  8. docker专题(2):docker常用管理命令(上)

    http://segmentfault.com/a/1190000000751601 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备 ...

  9. MSP430F149流水灯闪烁以及数码管的显示

    今天下午写了一个流水灯闪烁的实验,总的来说,不难,因为这块板子集合的电路图没有上一块那么复杂,所以总的来说,还是比较顺手,开始的时候,出现流水灯没有流转的现象,原来是没有加入延时函数,后来经过调整,结 ...

  10. ios开发中常用的也是最基本的mysql语句

    MySQL常用基本SQL语句小结——(转) sql语言不经常用,每次再用都隔好久的时间,以致最基本的都想不起来了,只好转一篇记着= - 找的时候方便 SQL分类:  DDL—数据定义语言(CREATE ...