android.widget.CursorAdapter
它首先实现了两个接口Filterable,CursorFilter.CursorFilterClient。
其中Filterable接口定义了getFilter()这个接口。
CursorFilterClient定义如下接口
        CharSequence convertToString(Cursor cursor);
        Cursor runQueryOnBackgroundThread(CharSequence constraint);
        Cursor getCursor();
        void changeCursor(Cursor cursor);
注意:CursorFilter.CursorFilterClient是非public的,所以只有文档中看不到它,在源码中才能看到它。
CursorAdapter.java文件如下      
package android.widget;
-----------------------------------省略---------------------------------
public abstract class CursorAdapter extends BaseAdapter implements Filterable,
        CursorFilter.CursorFilterClient {
    /**
     * This field should be made private, so it is hidden from the SDK.
     * {@hide}
     */
    protected boolean mDataValid;
    /**
     * This field should be made private, so it is hidden from the SDK.
     * {@hide}
     */
    protected boolean mAutoRequery;
    /**
     * This field should be made private, so it is hidden from the SDK.
     * {@hide}
     */
    protected Cursor mCursor;
-----------------------------------省略---------------------------------
    protected CursorFilter mCursorFilter;
    /**
     * This field should be made private, so it is hidden from the SDK.
     * {@hide}
     */
    protected FilterQueryProvider mFilterQueryProvider;
-----------------------------------省略---------------------------------
    public Cursor getCursor() {
        return mCursor;
    }
-----------------------------------省略---------------------------------       
    public void changeCursor(Cursor cursor) {
-----------------------------------省略---------------------------------
    }
-----------------------------------省略---------------------------------
    public CharSequence convertToString(Cursor cursor) {
        return cursor == null ? "" : cursor.toString();
    }
-----------------------------------省略---------------------------------
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
        if (mFilterQueryProvider != null) {
            return mFilterQueryProvider.runQuery(constraint);
        }
        return mCursor;
    }
    public Filter getFilter() {
        if (mCursorFilter == null) {
            mCursorFilter = new CursorFilter(this);
        }
        return mCursorFilter;
    }
-----------------------------------省略---------------------------------
    public FilterQueryProvider getFilterQueryProvider() {
        return mFilterQueryProvider;
    }
-----------------------------------省略---------------------------------
    public void setFilterQueryProvider(FilterQueryProvider filterQueryProvider) {
        mFilterQueryProvider = filterQueryProvider;
    }
-----------------------------------省略---------------------------------
}
CursorFilter文件如下:
package android.widget;
import android.database.Cursor;
class CursorFilter extends Filter {  
    CursorFilterClient mClient;
    interface CursorFilterClient {
        CharSequence convertToString(Cursor cursor);
        Cursor runQueryOnBackgroundThread(CharSequence constraint);
        Cursor getCursor();
        void changeCursor(Cursor cursor);
    }
    CursorFilter(CursorFilterClient client) {
        mClient = client;
    }  
    @Override
    public CharSequence convertResultToString(Object resultValue) {
        return mClient.convertToString((Cursor) resultValue);
    }
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        Cursor cursor = mClient.runQueryOnBackgroundThread(constraint);
        FilterResults results = new FilterResults();
        if (cursor != null) {
            results.count = cursor.getCount();
            results.values = cursor;
        } else {
            results.count = 0;
            results.values = null;
        }
        return results;
    }
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        Cursor oldCursor = mClient.getCursor();
        
        if (results.values != null && results.values != oldCursor) {
            mClient.changeCursor((Cursor) results.values);
        }
    }
}
关于Filter的更多内容参见《关键字过滤器Filter》。
如何使用Filter呢?
调用CursorAdapter的getFilter方法得到一个Filter,调用它的filter (CharSequence constraint)方法。其中constraint就是关键字。
注意1:如果不给CursorAdapter设置FilterQueryProvider(通过setFilterQueryProvider方法),
那么就需要重载Cursor runQueryOnBackgroundThread(CharSequence constraint)来实现对数据库的过滤查询。
当然FilterQueryProvider其实就是在它唯一的方法public abstract Cursor runQuery (CharSequence constraint)里面实现对数据库的过滤查询。
参考源代码可以知道如果提供了FilterQueryProvider,那么CursorAdapter就是在runQueryOnBackgroundThread方法中直接调用FilterQueryProvider的runQuery方法来进行数据库的过滤查询

最新文章

  1. 我读汤姆大叔的深入理解js(二)
  2. kylin1.5新特性 new aggregation group
  3. hbases索引技术:Lily HBase Indexer介绍
  4. MySQL限时解答
  5. 测量行业(RTK)相关的小知识总结
  6. LeetCode Factorial Trailing Zeroes
  7. [BS-19]更改UITextField的placeholder文字颜色的5种方法
  8. Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)
  9. [转]优化数据库大幅度提高Oracle的性能
  10. DevExpress 用户控件 分页(下)
  11. ORACLE存储过程笔记1
  12. sed中求公共前缀
  13. 学习Jammendo代码的心路历程(二)ViewFlipper数据的填充
  14. 关于Java泛型"擦除"的一点思考
  15. .NETCore 千星项目模块化开发框架 SimplCommerce 详解
  16. 软件开发者路线图梗概&书摘chapter5
  17. python之三元表达式、列表推导、生成器表达式、递归、匿名函数、内置函数
  18. Zookeeper —— 初识
  19. POJ 1488 - TEX Quotes
  20. 使用CSDN-markdown编辑器

热门文章

  1. MemoryStream 的GetBuffer() 和 ToArray()的区别
  2. VirtualBox 使用
  3. [分享·JavaScript]提取Table中的内容到XML对象
  4. HDU1232畅通工程
  5. windows7环境下svn服务器的配置及使用
  6. Android系统下检测Wifi连接互联网是否正常的代码
  7. express 4.x 模板引擎与express.static
  8. Xcode去除某种类型的警告
  9. phpDoc使用说明
  10. gitlb gerrit jenkins CI整合调试