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),它是一种面 ...
随机推荐
- python 数据聚合与分组
前面讲完了字符处理,但对数据进行整体性的聚合运算以及分组操作也是数据分析的重要内容. 通过数据的聚合与分组,我们能更容易的发现隐藏在数据中的规律. 数据分组 数据的分组核心思想是:拆分-组织-合并 首 ...
- [转]学好Mac常用命令,助力iOS开发
转自:http://www.jianshu.com/p/d9ec00d28237 序言 在iOS开发的过程中,更多地注重iOS开发的效率,熟练使用Mac终端操作的常用命令,可以让你更好的游刃于iO ...
- 循序渐进看Java web日志跟踪(3)-Log4J的使用和配置
之前说过关于java日志跟踪的几大主要用的框架,也说到了,其实在其中,Log4J充当着一个相当重要的角色.目前,大部分框架也都是采用的是Log4J,虽然说它已经停止了更新,作者也重新起了LogBack ...
- string,stringbuilder和stringbuffer的区别
String.StringBuffer.StringBuilder之间的区别(网上收集) StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可 ...
- Oracle odi 数据表导出到文件
最近新客户要求,以EXCEL数据方式,将数据表的内容,通过AS2协议传输到客户那边,本来打算使用存储过程直接输出EXCEL,但一想,ODI这么强大的工具应该可以直接进行转换,所以参考了一下官方标准文档 ...
- Web Scraper使用
{ "selectors": [{ "parentSelectors": ["_root"], "type": &quo ...
- MySQL新增用户以及数据库访问授权
# mysql -u root -p # 允许本地 IP 访问 localhost, 127.0.0.1 # insert into mysql.user(Host,User,Password) va ...
- rpm 安装包制作
rpm 安装包制作 思路 参照系统自带 etcd 解压->替换掉执行文件->打包 1 预备安装工具 下载工具 yumloader #yum install -y yum-utils 解压工 ...
- 【实验室笔记】zedgraph控件属性总结
//图表的X轴刻度线是否显示 this.zedGraphControl1.GraphPane.XAxis.MajorGrid.IsVisible = true; //图表的X轴刻度线的颜色 this. ...
- python下载时报错 Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time
def downloadXml(isExists,filedir,filename): if not isExists: os.mkdir(filedir) local = os.path.join( ...