android filter

http://blog.sina.com.cn/s/blog_6d720e59010127st.html



android filter

  (2012-08-17 14:22:12)
标签: 

杂谈

 

一、何谓Android的过滤机制?

       Android对数据的处理是分层的,从上到下,可以分为:数据层、提供层、Cursor层(不好意思,没找到一个词来表示)、适配层、显示层。每个层次通过一定的机制,可以使数据发生变化时能够上下通知。如下图:
 
       显示层(ListView,GridView,AutoCompleteTextView等)
       适配层(Adpater)
       Cursor层(Cursor)
       提供层(ContentProvider)
       数据层(文件、sqlite、SharedPreference)
 
       数据层是数据具体的存储方式,它可以包括文件、sqlite数据库以及SharedPreference。提供层向上层提供了统一的数据调用方式,并负 责向其它应用共享数据。Cursor层将查询的数据统一成Cursor的形式来使用。适配层用来连接Cursor层和显示层,将数据和界面连接起来。显示 层负责数据的显示。
       另外,Andriod提供了数据的过滤机制,也就是在不改变数据存储的情况下,异步或同步的过滤符合条件的数据,并即时的显示在界面上。
       Android原生的例子当中,最明显的例子就是AutoCompleteTextView,见下图。

       当输入“C程”时,数据库中自动过滤出了还有该字符串的联系人姓名,并显示出来。
 
       二、Android做了哪些?
       1、为了实现数据的过滤,andorid设计了抽象类Filter,进行异步和同步的数据过滤操作。
       2、在Adapter中继承Filterable,提供给使用者Filter,进行过滤。
       3、在不同的View中,获得查询约束字符串,传递给Adapter,并且提供配合数据过滤的界面支持。
 
       三、Filter类
       Filter的使用流程如下:
       调用filter方法 ->在另一线程中调用performFiltering进行数据查询->得到数据过滤结果后调用publishResults将结果返回到使用它的客户端。
       该类中的performFiltering和publishResults均为抽象方法,需要继承者自己重写。
       CursorFilter类就是Filter类的继承。CursorFilter在performFiltering中并没有直接进行数据的过滤,而是 加入了CursorFilterClient成员,将过滤的操作转让给了CursorFilterClient,实际上CursorAdpater就是继 承了CursorFilterClient接口,也就是说过滤操作实际上是在CursorAdapter中执行的。
 
       四、Filterable接口
       常用的Adapter基本上都继承了Filterable接口,如CursorAdapter,ArrayAdapter,SimpleAdapter 等。该接口只有一个函数,名为getFilter,通过该函数可以通过Adaper获取Filter,然后通过该Filter进行过滤。
 
       在CursorAdapter中,可以更改过滤的流程,有两种方式:
       1、通过重写CursorAdapter的runQueryOnBackgroundThre ad函数,在函数中根据过滤约束字符串,重新查找生成新的Cursor。Adapter会适时将旧的Cursor进行替换。
       2、通过调用setFilterQueryProvider函数,提供一个FilterQueryProvider,该对象含有runQuery方法,作用同runQueryOnBackgroundThre ad方法相同。
       使用那种方法取决于您是不是重载CursorAdapter,以及您的过滤动作需要在Adpter中实现还是在主程序中实现。
 
       五、数据过滤功能的View的界面支持。
       为了实现数据过滤的功能,在数据显示层,也有相应的支持。比如ListView和GridView,设置了setFilterText函数,通过该函数 可以一方面进行数据的过滤,另一方面显示一个PopupWindow,提示用户输入了那种过滤条件。AutoCompleteTextView当用户在文 本框输入文字时,自动进行过滤,并弹出列表显示过滤数据。

 

    六、实战

    知道了Android的过滤机制,我们就以AutoCompleteTextView为例,通过输入文本筛选数据库中的数据。

    1、首先写ContentProvider
    由于代码量比较多,只写出对外的接口。

 
 
  1. public   static   final   class  Location  implements  BaseColumns 
  2.     public   static   final  Uri CONTENT_URI Uri.withAppendedPath(AUTHORITY_URI,  "location" ); 
  3.     public   static   final  String CONTENT_TYPE  "vnd.android.cursor.dir/weather_location" ; 
  4.     public   static   final  String CONTENT_ITEM_TYPE  "vnd.android.cursor.item/weather_location" ; 
  5.     public   static   final  String CONTENT_DIRECTORY  "location" ; 
  6.  
  7.     public   static   final  String LOCATION_NAME  "location_name" ; 
  8.     public   static   final  String LONGITUDE  "longitude" ; 
  9.     public   static   final  String ALTITUDE  "altitude" ; 

   2、写CursorAdapter

 
 
  1. private   static   class  LocationAdapter  extends  CursorAdapter 
  2.     private  LayoutInflater mInflater; 
  3.     private  Context mContext; 
  4.     private  Cursor mCursor; 
  5.     public  LocationAdapter(Context context, Cursor c) 
  6.         super (context, c); 
  7.         mContext context; 
  8.         mInflater (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
  9.     
  10.  
  11.     @Override  
  12.     public   void  bindView(View view, Context context, Cursor cursor) 
  13.         TextView textView (TextView) view; 
  14.         String location cursor.getString(cursor.getColumnIndex(Location.LOCATION_NAME)); 
  15.         textView.setText(location); 
  16.     
  17.  
  18.     @Override  
  19.     public  View newView(Context context, Cursor cursor, ViewGroup parent) 
  20.         return  mInflater.inflate(android.R.layout.simple_dropdown_item_1line,  null ); 
  21.     
  22.      
  23.     @Override  
  24.     public  Cursor runQueryOnBackgroundThread(CharSequence constraint) 
  25.         String selection Location.LOCATION_NAME LIKE '%"  constraint  "%'" ; 
  26.         return  mContext.getContentResolver().query(Location.CONTENT_URI 
  27.                 null , selection,  null ,  null ); 
  28.     
  29.      
  30.       
  31.     @Override  
  32.     public  CharSequence convertToString(Cursor cursor) 
  33.         return  cursor.getString(cursor.getColumnIndex(Location.LOCATION_NAME)); 
  34.     
       3、AutoCompleteTextView与Adapter关联。
 
 
 
  1. private   void  initialTextView() 
  2.     mTextView new  AutoCompleteTextView(mContext); 
  3.     mTextView.setThreshold(0 ); 
  4.      
  5.     Cursor cursor mContext.getContentResolver().query(Location.CONTENT_URI 
  6.             null ,  null ,  null ,  null ); 
  7.     LocationAdapter adapter new  LocationAdapter(mContext, cursor); 
  8.     mTextView.setAdapter(adapter); 
       需要提醒的是:AutoCompleteTextView内部的数据筛选并没用采用异步筛选的方式,而是直接调用了Filter内部的performFiltering,所以尽量不要在筛选的函数内做太费时间的事情,否则就乎出现不流畅的情况。
 

 

       Enjoy it!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值