【发布时间】:2014-09-06 15:36:20
【问题描述】:
我正在研究一个列表视图过滤器,也就是说,有一个编辑框,如果我输入一些关键字,列表视图数据会相应地改变。首先,有一个数据集。
private ArrayList<PostItem> postList;
假设列表中已经填满了数据,这里是带有过滤的适配器:
private class PostAdapter extends ArrayAdapter<PostItem> implements
Filterable {
public PostAdapter(Context context, int resource, List<PostItem> items) {
super(context, resource, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
v = vi.inflate(R.layout.post_item, parent, false);
}
PostItem post = getItem(position);
if (post != null) {
TextView title = (TextView) v.findViewById(R.id.postTitle);
TextView date = (TextView) v.findViewById(R.id.postDate);
v.setTag(post.id);
title.setText(Html.fromHtml(post.title));
date.setText(post.name + " "
+ getResources().getString(R.string.post_on) + " "
+ post.date);
}
return v;
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
ArrayList<PostItem> filteredList = (ArrayList<PostItem>)results.values;
clear();
for (PostItem item :filteredList) {
add(item);
}
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList<PostItem> filteredArray = new ArrayList<PostItem>();
constraint = constraint.toString().toLowerCase();
for (PostItem item : postList) {
if (item.title.toLowerCase().contains(constraint)) {
filteredArray.add(item);
}
}
results.count = filteredArray.size();
results.values = filteredArray;
return results;
}
};
return filter;
}
}
问题是,clear() 函数还会删除 postList 中包含的所有项目,并插入所有最新的过滤结果。如何解决?我试图有一个复制的变量,例如copyPostList = postList 但还是一样。感谢您的帮助
更新:更多解释:
首先,postList 有项目“abc”;
然后,输入“ab”,列表显示“abc”,正确
然后,输入“xyz”,列表什么都不显示,这是正确的
最后输入“abc”,列表不显示,不正确
【问题讨论】:
-
这个问题让我想起了stackoverflow.com/questions/14663725/list-view-filter-android,但很高兴看到一个解决方案:D
标签: android listview android-listview