首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义listview_items过滤列表视图的搜索视图

使用自定义listview_items过滤列表视图的搜索视图
EN

Stack Overflow用户
提问于 2015-08-25 04:16:59
回答 1查看 989关注 0票数 0

我的应用程序有一个自定义的ListView-Adapter,它可以将一个包含多个TextViews的listview_item扩展到一个ListView中。

我已经在布局中添加了一个SearchView,但我希望它能够搜索该ListView,并通过查看在SearchView中键入的数据是否与TextViews中来自listview_items的任何数据相同来对其进行过滤。

EN

回答 1

Stack Overflow用户

发布于 2015-08-25 04:27:19

覆盖acitivity类中的OnQueryTextListener,如下所示:

代码语言:javascript
复制
@Override
public boolean onQueryTextChange(String newText) {
    mAdapter.getFilter().filter(newText);
    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    mAdapter.getFilter().filter(query);
    return true;
}

在适配器内部,实现过滤器,如:

代码语言:javascript
复制
public Filter getFilter() {
    if (mFliter == null)
        mFliter = new CustomFilter();
    return mFliter;

}
    private class CustomFilter extends Filter {
        // called when adpater filter method is called
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();
            if (constraint != null && constraint.toString().length() > 0) {
                ArrayList<CustomObject> filt = new ArrayList<CustomObject>(); //filtered list
                for (int i = 0; i < originalList.size(); i++) {
                    CustomObject m = originalList.get(i);
                    if (m.getName().toLowerCase().contains(constraint)) {
                        filt.add(m); //add only items which matches
                    }
                }
                result.count = filt.size();
                result.values = filt;
            } else { // return original list
                synchronized (this) { 
                    result.values = originalList;
                    result.count = originalList.size();
                }
            }
            return result;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            if (results != null) {
                setList((ArrayList<CustomObject>) results.values); // notify data set changed
            } else {
                setList((ArrayList<CarObject>) originalList);
            }
        }
    }

    public void setList(ArrayList<CarObject> data) {
        mList = data; // set the adapter list to data
        YourAdapter.this.notifyDataSetChanged(); // notify data set change
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32191000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档