ListView过滤搜索功能源码分析

近期维护联系人(Contacts)代码时,发现其中有个功能是根据你输入的字串来搜索出ListView相匹配数据的一项功能。鉴于网上大部分内容都是写其一些基本用法,本文分析ListView其搜索过滤功能的实现,让大家在使用过程中能够做到心里有底,正确的使用好这项功能。

本文章分为两个主题

  1. ListView中怎么使用搜索过滤功能
  2. ListView搜索过滤功能的实现分析
ListView中怎么使用搜索过滤功能

实现ListView搜索过滤功能的一般做法如下:

  1. 开启ListView过滤搜索功能
mContactListView.setTextFilterEnabled(true);
  1. 自定义Adapter实现Filterbale接口,实现getFilter()方法,返回自定义Filter对象。
@Override
public Filter getFilter() {
    return new MyFilter();
}
  1. 继承Filter实现performFiltering(CharSequence constraint)publishResults(CharSequence constraint, FilterResults results)方法,实现自己的过滤规则。
 private class MyFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();
            Uri uri = ContactsContract.Contacts.CONTENT_URI;
            if (!TextUtils.isEmpty(constraint)) {
                uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI
                        , Uri.encode(constraint.toString()));
            }
            //TODO:this should not be run in the UI thread
            Cursor cursor = mContext.getContentResolver().query(uri, PROJECTION, null, null, null);
            if (cursor != null) {
                filterResults.values = cursor;
                filterResults.count = cursor.getCount();
            } else {
                filterResults.values = null;
                filterResults.count = 0;
            }
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results.count > 0) {
                swapCursor((Cursor) results.values);
            } else {
                notifyDataSetInvalidated();
            }
        }
    }
}

其中performFiltering这里你可以根据过滤的字串constraint(由ListViewsetFilterText(String filterText)传入)来写入你自己的过滤规则;publishResults则接受performFiltering回传的结果,你需要根据其结果来决定是否更新ListView的数据。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值