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方法来进行数据库的过滤查询

cursorfilter的更多相关文章

  1. Android -- Adapter

    体系 public interface Adapter----0层(表示继承体系中的层次)  public interface ExpandableListAdapter---(无所谓层次因为没有其他 ...

  2. Android Framework 记录之二

    接着上次的记录,续写. 23.services文件夹 文件 描写叙述 class AlarmManagerService extends IAlarmManager.Stub { //定时管理服务 p ...

  3. [Android Pro] AndroidX重构和映射

    原文地址:https://developer.android.com/topic/libraries/support-library/refactor https://blog.csdn.net/ch ...

随机推荐

  1. LeetCode Lowest Common Ancestor of a Binary Serach Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  2. CCParticleSystem粒子系统

    欢迎转载!转载时请注明出处:http://write.blog.csdn.net/postedit/8124781 第一次接触粒子系统,以前游戏里面的一些小特效,像制作动画一样,是采用一帧一帧的切出来 ...

  3. The Ninth Hunan Collegiate Programming Contest (2013) Problem I

    Problem I Interesting Calculator There is an interesting calculator. It has 3 rows of button. Row 1: ...

  4. XML小总结

    XHTML 标签都有固定含义,不能去创造新的标签. 而 XML 支持自定义标签,具有扩 展性. 定义 XML 文档结构有两种方法:DTD 和 XSD. XSD 本身就是 XML 文档结构,是继 DTD ...

  5. [ CodeVS冲杯之路 ] P1197

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密 ...

  6. 慕课网-安卓工程师初养成-4-8 Java循环语句之 do...while

    do...while 循环与 while 循环语法有些类似,但执行过程差别比较大. 语法:  执行过程: <1>. 先执行一遍循环操作,然后判断循环条件是否成立 <2>. 如果 ...

  7. jquery获取对象

    1.JQuery的核心的一些方法 $("Element").length; ‘元素的个数,是个属性 $("Element").size(); ’也是元素的个数, ...

  8. 正宗PC Unix实验环境

    首先解释一下PCUNIX环境,在PC服务器上可以安装多种UNIX系统例如ScoUnix,SunSolarisx86系统,BSD系统等等,但是唯一应用在生产系统(例如邮政储蓄,证券和某些银行前置机等)的 ...

  9. 正斜杠和反斜杠-windows、web、c语言大讨论

    首先,在c语言中,正斜杠/ slash 表示除法反斜杠\ backslash ,\用于转义字符,\n.\0. 其次,UNIX 操作系统设计了这种路径分隔法,它使用正斜杠:/.由于网络是首先应用在 UN ...

  10. 【Python】django安装

    官方下载:https://www.djangoproject.com/download/ 报错 [root@test Django-]# python setup.py install Traceba ...