Android 数据过滤器:Filter

类图:

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

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

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

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

[java] view plain copy

print?

  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主线程根据新的数据绘制界面:

[java] view plain copy

print?

  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:

[html] view plain copy

print?

  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:

[java] view plain copy

print?

  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的监听函数如下:

[java] view plain copy

print?

  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接口,定义自己的过滤器。

时间: 2024-10-11 11:41:53

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

AngularJS学习--- 过滤器(filter),格式化要显示的数据 step 9

1.切换目录,启动项目 git checkout step-9 npm start 2.需求: 格式化要显示的数据. 比如要将true-->yes,false-->no,这样相互替换. 3.效果: 4.代码实现: 这里主要是使用filter过滤器来进行数据过滤,这里只是在前端进行数据过滤,原始数据是不发生变化的. $filter:Filters are used for formatting data displayed to the user,格式化要显示的数据. 用法: {{ expres

JSP内置对象的作用域,及过滤器filter

pageContext:只要跳转页面,就不存在. request, 只要在当前页面就存在 session, 只有浏览器关闭,才不存在. application,只有服务器关闭后,才不存在. 如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里. 从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量. 如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期. 所谓请求周期,就是指从htt

Android 数据保存

Android数据保存方法 android数据保存主要保存以下三种: 1.共享参数文件中保存简单的键值对数据: 2.保存任意的文件数据到Android的文件系统中: 3.使用SQLite数据库管理 保存键值集 通过使用SharePreferences API来保存简单的键值对数据. 共享参数文件的获取或创建: 可以通过以下两种方法来获取: getSharedPreferences()  该方法需要提供一个共享参数文件的名称标识,该方法可以在任意Context中调用 getPreferences(

AngularJS 过滤器(filter)

过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们是:currency(货币).date(日期).filter(子串匹配).json(格式化json对象).limitTo(限制个数).lowercase(小写).uppercase(大写).number(数字).orderBy(排序).总共九种.除此之外还可以自定义过滤器,这个就强大了,可以满足任何

深入分析JavaWeb Item36 -- 过滤器Filter高级应用

在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的方法. 使用Decorator设计模式对方法进行增强. 使用代理 在阎宏博士的<JAVA与模式>一书中

ABP官方文档翻译 3.8 数据过滤器

数据顾虑器 介绍 预定义过滤器 ISoftDelete 何时使用? IMustHaveTenant 何时使用? IMayHaveTenant 何时使用 禁用过滤器 关于using语句 关于多租户 全局禁用过滤器 启用过滤器 设置过滤器参数 SetTenantId方法 ORM集成 Entity Framework EntityFramework.DynaamicFilters文档 其他ORMs 介绍 软删除模式是常用的模式,这种模式并没有从数据库中删除实体而是打上'deleted'的标记.所以,如

JavaWeb--Servlet过滤器Filter和SpringMVC的HandlerInterceptor(Session和Cookie登录认证)

拦截一些请求进行处理,比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,编码,或者限制时间点访问等等,是非常有必要的.所以就有了此篇文章啦. 文章结构:(1)Servlet过滤器Filter:(2)SpringMVC的HandlerInterceptor:(3)对比认知. 一.Servlet过滤器Filter: 此部分是从赵四大佬那里学来的,并补充自己的认知 (1)概念: 能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不产生请求和响应对象,它只能

SpringMVC 过滤器Filter使用解析

SpringMVC框架是一个成熟的优秀Java web开发框架,学习研究框架设计有助于我们更好的理解和掌握spring MVC,设计和写出更符合的结构和代码. 本节主要是研读SpringMVC框架中的过滤器设置,以编码处理过滤器为例来学习框架内是怎样设置过滤器的. 如上所示的spring-web.jar包结构所示, Spring的web包中中提供有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所当然地实现了javax.servlet.Filter,

AngularJS过滤器filter入门

在开发中,经常会遇到这样的场景 如用户的性别分为“男”和“女”,在数据库中保存的值为1和0,用户在查看自己的性别时后端返回的值自然是1或0,前端要转换为“男”或“女”再显示出来: 如我要换个羽毛球拍,某猫上羽毛球拍的品牌多达数十种,我想单独查看YONEX这个品牌的羽毛球拍: 买完羽毛球拍我还想买一桶羽毛球,点击按销量排序展示商品: 以上三种场景分别对数据进行了转换/筛选/排序,总而言之就是对数据的格式化,AngularJS的filter就是用来做这个事的. 内置过滤器 AngularJS内置了很