近期维护联系人(Contacts)代码时,发现其中有个功能是根据你输入的字串来搜索出ListView相匹配数据的一项功能。鉴于网上大部分内容都是写其一些基本用法,本文分析ListView其搜索过滤功能的实现,让大家在使用过程中能够做到心里有底,正确的使用好这项功能。
本文章分为两个主题
ListView
中怎么使用搜索过滤功能ListView
搜索过滤功能的实现分析
ListView中怎么使用搜索过滤功能
实现ListView搜索过滤功能的一般做法如下:
- 开启
ListView
过滤搜索功能
mContactListView.setTextFilterEnabled(true);
- 自定义
Adapter
实现Filterbale
接口,实现getFilter()
方法,返回自定义Filter
对象。
@Override
public Filter getFilter() {
return new MyFilter();
}
- 继承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(由ListView
的setFilterText(String filterText)
传入)来写入你自己的过滤规则;publishResults
则接受performFiltering
回传的结果,你需要根据其结果来决定是否更新ListView
的数据。