类图:

通常可以将SearchView和ListView结合,实现数据的搜索和过滤。

1.监听SearchView,SearchView.setOnQueryTextListener(OnQueryTextListener listener);

2.开启ListView的过滤功能,listView.setTextFilterEnabled(true)。必须开启,否则不会过滤;

3..当SearchView接收到输入事件后,调用ListView.setFilterText(filterText)方法,该方法会通过Adapter得到Filter,然后调用Filter.filter(filterText):

  1. public void setFilterText(String filterText) {
  2. // TODO: Should we check for acceptFilter()?
  3. if (mTextFilterEnabled && !TextUtils.isEmpty(filterText)) {
  4. createTextFilter(false);
  5. // This is going to call our listener onTextChanged, but we might not
  6. // be ready to bring up a window yet
  7. mTextFilter.setText(filterText);
  8. mTextFilter.setSelection(filterText.length());
  9. if (mAdapter instanceof Filterable) {
  10. // if mPopup is non-null, then onTextChanged will do the filtering
  11. if (mPopup == null) {
  12. Filter f = ((Filterable) mAdapter).getFilter();
  13. f.filter(filterText);
  14. }
  15. // Set filtered to true so we will display the filter window when our main
  16. // window is ready
  17. mFiltered = true;
  18. mDataSetObserver.clearSavedState();
  19. }
  20. }
  21. }

4.Filter.filter(filterText)方法最终会调用Filter.performFiltering(filterText)和Filter.publishResults(CharSequence filterText, FilterResults results)。performFiltering(filterText)方法完成过滤处理并且返回结果FilterResults,而publishResults(CharSequence filterText, FilterResults results)则根据返回的结果进行相应的处理。

5.Filter.publishResults(CharSequence filterText, FilterResults results)调用了BaseAdapter.notifyDataSetChanged()方法,该方法用于当Adapter的数据发生变化时,通知UI主线程根据新的数据绘制界面:

  1. @Override
  2. protected void publishResults(CharSequence constraint, FilterResults results) {
  3. //noinspection unchecked
  4. mObjects = (List<T>) results.values;
  5. if (results.count > 0) {
  6. notifyDataSetChanged();
  7. } else {
  8. notifyDataSetInvalidated();
  9. }
  10. }

数据过滤就这样完成了。

下面给出例子。

布局文件filter_activity.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <SearchView
  7. android:id="@+id/searchView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content" >
  10. </SearchView>
  11. <ListView
  12. android:id="@+id/listView1"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content" >
  15. </ListView>
  16. </LinearLayout>

类文件MainActivity.java:

  1. package com.zzj.ui.filterdemo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.ArrayAdapter;
  5. import android.widget.ListView;
  6. import android.widget.SearchView;
  7. import android.widget.SearchView.OnQueryTextListener;
  8. import com.zzj.ui.R;
  9. public class MainActivity extends Activity implements OnQueryTextListener {
  10. private ListView listView;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.filter_activity);
  15. SearchView searchView = (SearchView) findViewById(R.id.searchView1);
  16. searchView.setOnQueryTextListener(this);
  17. searchView.setSubmitButtonEnabled(false);
  18. searchView.setIconifiedByDefault(false);
  19. listView = (ListView) findViewById(R.id.listView1);
  20. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
  21. android.R.layout.simple_list_item_1, new String[] { "Bei jing",
  22. "Shang hai", "Chang sha", "Chang chun", "Nan jing",
  23. "Dong jing", "Ji nan", "Qing dao", "Xiang tan",
  24. "Zhu zhou", "Heng yang" });
  25. listView.setAdapter(adapter);
  26. // 开启过滤功能
  27. listView.setTextFilterEnabled(true);
  28. }
  29. @Override
  30. public boolean onQueryTextSubmit(String query) {
  31. return false;
  32. }
  33. @Override
  34. public boolean onQueryTextChange(String newText) {
  35. if (newText == null || newText.length() == 0) {
  36. listView.clearTextFilter();
  37. } else {
  38. listView.setFilterText(newText);
  39. }
  40. return true;
  41. }
  42. }

效果图:

如图所示,弹出了一个浮动框,这是listView.setFilterText(filterText)弹出来的。如果不想要这个浮动框,可以先获取Filter,然后调用Filter.filter(filterText)。

修改SearchView的监听函数如下:

  1. @Override
  2. public boolean onQueryTextChange(String newText) {
  3. ListAdapter adapter = listView.getAdapter();
  4. if (adapter instanceof Filterable) {
  5. Filter filter = ((Filterable) adapter).getFilter();
  6. if (newText == null || newText.length() == 0) {
  7. filter.filter(null);
  8. } else {
  9. filter.filter(newText);
  10. }
  11. }
  12. return true;
  13. }

使用这种方法不需要开启ListView的过滤功能。效果如下:

上面使用的是ArrayAdapter的过滤功能,我们也可以继承BaseAdapter,然后实现Filterable接口,定义自己的过滤器。

Android 数据过滤器:Filter的更多相关文章

  1. Android数据过滤器:Filter

    类图: 通常可以将SearchView和ListView结合,实现数据的搜索和过滤. 1.监听SearchView,SearchView.setOnQueryTextListener(OnQueryT ...

  2. ABP(现代ASP.NET样板开发框架)系列之13、ABP领域层——数据过滤器(Data filters)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之13.ABP领域层——数据过滤器(Data filters) ABP是“ASP.NET Boilerplate P ...

  3. ABP理论学习之数据过滤器

    返回总目录 本篇目录 介绍 预定义过滤器 关闭过滤器 开启过滤器 设置过滤器参数 定义自定义过滤器 其他ORM 介绍 软删除模式通常用于不会真正从数据库删除一个实体而是仅仅将它标记为"已删除 ...

  4. Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例

    Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...

  5. java Servlet中的过滤器Filter

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

  6. Servlet中的过滤器Filter用法

    1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...

  7. Servlet中的过滤器Filter详解

    加载执行顺序 context-param->listener->filter->servlet web.xml中元素执行的顺序listener->filter->stru ...

  8. AngularJS的过滤器$filter

    过滤器(filter)主要用于数据的格式上,通过某个规则,把值处理后返回结果.例如获得数据集,可排序后再返回. ng内置的共有九种过滤器: currency 货币 使用currency可以将数字格式化 ...

  9. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

随机推荐

  1. My Eclipse Security Alert

    SECURITY ALERT: INTEGRITY CHECK ERROR This product did not pass the MyEclipse integrity check. This ...

  2. memcache学习和分析

    Memcached 特点• 具有非常快的处理速度• 缺乏认证以及安全管制,应将其放置在防火墙之后• 重启后数据全部丢失• 可以给数据设置有效期• 适合使用大量低CPU的机器搭建集群• 各节点之间各自独 ...

  3. angular2+webpack的搭建过程遇到的问题记录

    最近在由于公司的项目要重构,Superiors要求将原先的Ionic1+angular1+gulp用全新的Ionic2+angular2+webpack重构.苦逼的Google了好久,环境搭建还是不太 ...

  4. UIColor,CGColor,CIColor三者间的区别和联系

    一.UIColor UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化.UIColor包含了一些类方法用于创建一 ...

  5. Lua 数据类型和 Redis 数据类型之间转换

    当 Lua 通过 call() 或 pcall() 函数执行 Redis 命令的时候,命令的返回值会被转换成 Lua 数据结构. 同样地,当 Lua 脚本在 Redis 内置的解释器里运行时,Lua ...

  6. jQuery中操作Ajax方法小结

    有时候,越深入去了解一个点,越发觉得自己无知,而之前当自己晓得一两个片面的点还洋洋自得,殊不知,这是多么讽刺 jQery对Ajax操作进行了封装,常见的 ajax()属于最底层的方法,使用频率很高的 ...

  7. HDOJ_就这么个烂题总是WA先放这把

    #include<stdio.h> __int64 A[100]={0}; __int64 B[100]={0}; __int64 SUM[100]={0}; int main() {in ...

  8. checkbox批量操作

    hang=data.split("\1");//获取 查询返回的数据 处理数据 var str=""; for(var i =0;i<hang.lengt ...

  9. NYOJ-914 Youth的最大化(贪心)

    Youth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? ...

  10. 《C程序设计语言》 squeeze函数(从字符串s中删除字符c)

    squeeze void squeeze(char string[], int ch) { int i, j; ; string[i] != '\0'; i++) { if (string[i] != ...