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):
- public void setFilterText(String filterText) {
- // TODO: Should we check for acceptFilter()?
- if (mTextFilterEnabled && !TextUtils.isEmpty(filterText)) {
- createTextFilter(false);
- // This is going to call our listener onTextChanged, but we might not
- // be ready to bring up a window yet
- mTextFilter.setText(filterText);
- mTextFilter.setSelection(filterText.length());
- if (mAdapter instanceof Filterable) {
- // if mPopup is non-null, then onTextChanged will do the filtering
- if (mPopup == null) {
- Filter f = ((Filterable) mAdapter).getFilter();
- f.filter(filterText);
- }
- // Set filtered to true so we will display the filter window when our main
- // window is ready
- mFiltered = true;
- mDataSetObserver.clearSavedState();
- }
- }
- }
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主线程根据新的数据绘制界面:
- @Override
- protected void publishResults(CharSequence constraint, FilterResults results) {
- //noinspection unchecked
- mObjects = (List<T>) results.values;
- if (results.count > 0) {
- notifyDataSetChanged();
- } else {
- notifyDataSetInvalidated();
- }
- }
数据过滤就这样完成了。
下面给出例子。
布局文件filter_activity.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <SearchView
- android:id="@+id/searchView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" >
- </SearchView>
- <ListView
- android:id="@+id/listView1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
- </ListView>
- </LinearLayout>
类文件MainActivity.java:
- package com.zzj.ui.filterdemo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import android.widget.SearchView;
- import android.widget.SearchView.OnQueryTextListener;
- import com.zzj.ui.R;
- public class MainActivity extends Activity implements OnQueryTextListener {
- private ListView listView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.filter_activity);
- SearchView searchView = (SearchView) findViewById(R.id.searchView1);
- searchView.setOnQueryTextListener(this);
- searchView.setSubmitButtonEnabled(false);
- searchView.setIconifiedByDefault(false);
- listView = (ListView) findViewById(R.id.listView1);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_list_item_1, new String[] { "Bei jing",
- "Shang hai", "Chang sha", "Chang chun", "Nan jing",
- "Dong jing", "Ji nan", "Qing dao", "Xiang tan",
- "Zhu zhou", "Heng yang" });
- listView.setAdapter(adapter);
- // 开启过滤功能
- listView.setTextFilterEnabled(true);
- }
- @Override
- public boolean onQueryTextSubmit(String query) {
- return false;
- }
- @Override
- public boolean onQueryTextChange(String newText) {
- if (newText == null || newText.length() == 0) {
- listView.clearTextFilter();
- } else {
- listView.setFilterText(newText);
- }
- return true;
- }
- }
效果图:
如图所示,弹出了一个浮动框,这是listView.setFilterText(filterText)弹出来的。如果不想要这个浮动框,可以先获取Filter,然后调用Filter.filter(filterText)。
修改SearchView的监听函数如下:
- @Override
- public boolean onQueryTextChange(String newText) {
- ListAdapter adapter = listView.getAdapter();
- if (adapter instanceof Filterable) {
- Filter filter = ((Filterable) adapter).getFilter();
- if (newText == null || newText.length() == 0) {
- filter.filter(null);
- } else {
- filter.filter(newText);
- }
- }
- return true;
- }
使用这种方法不需要开启ListView的过滤功能。效果如下:
上面使用的是ArrayAdapter的过滤功能,我们也可以继承BaseAdapter,然后实现Filterable接口,定义自己的过滤器。
Android 数据过滤器:Filter的更多相关文章
- Android数据过滤器:Filter
类图: 通常可以将SearchView和ListView结合,实现数据的搜索和过滤. 1.监听SearchView,SearchView.setOnQueryTextListener(OnQueryT ...
- ABP(现代ASP.NET样板开发框架)系列之13、ABP领域层——数据过滤器(Data filters)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之13.ABP领域层——数据过滤器(Data filters) ABP是“ASP.NET Boilerplate P ...
- ABP理论学习之数据过滤器
返回总目录 本篇目录 介绍 预定义过滤器 关闭过滤器 开启过滤器 设置过滤器参数 定义自定义过滤器 其他ORM 介绍 软删除模式通常用于不会真正从数据库删除一个实体而是仅仅将它标记为"已删除 ...
- Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例
Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...
- java Servlet中的过滤器Filter
web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...
- Servlet中的过滤器Filter用法
1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...
- Servlet中的过滤器Filter详解
加载执行顺序 context-param->listener->filter->servlet web.xml中元素执行的顺序listener->filter->stru ...
- AngularJS的过滤器$filter
过滤器(filter)主要用于数据的格式上,通过某个规则,把值处理后返回结果.例如获得数据集,可排序后再返回. ng内置的共有九种过滤器: currency 货币 使用currency可以将数字格式化 ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
随机推荐
- sql 时间格式化
sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...
- 单向链表仿LinkedList
public class ChainTable { private Node firstNode;//第一个节点 private Node lastNode;//最后一个节点 private int ...
- CoreAnimation的使用
一.CABasicAnimation CABasicAnimation *anim = [CABasicAnimation animation]; anim.keyPath = @"posi ...
- moodle笔记之-权限api
<?php//权限定义$capabilities = array( 'mod/mytest:managefiles' => array(//具体的权限:插件类型/插件名/权限 这里是增加一 ...
- Java基础第二章
- WCF发布错误及解决方案
一:在本机直接运行时出错 使用WCF写了一个小程序测试一下它的功能在运行时报错.“添加服务失败.服务元数据可能无法访问.请确保服务正在运行并且正在公开元数据.” 如下图所示: 查了下资料把它解决了,记 ...
- sqlserver负载均衡
http://www.cnblogs.com/gaizai/p/3644510.html
- python--day4--迭代器、生成器
列表生成式: 需求:列表[1,2,3,4,5,6,7,8,9]每个值加1,实现的方法: a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a:b.append(i+1 ...
- 8. Shell 文件包含
1. 语法 . filename # 注意点号(.)和文件名中间有一空格 或 source filename ### test.sh #!/bin/bash url="www.baidu.c ...
- angularjs各版本下载
下载网址:https://code.angularjs.org/1.2.14/