关于BaseAdapter中notifyDataSetChanged 失效的问题
昨天写了一个Listview的过滤器,过滤没有错误,确实是改变了List里的数据。但是调用notifyDataSetChanged 后发现没有任何效果,很是郁闷。经过上网查询终于解决了。虽然还有一些小问题,但是还是可以说明问题的。代码如下:
public class ArrayFilter extends Filter {
private List list, save;
private FileExplorerAdapter adapter;
public ArrayFilter(FileExplorerAdapter adapter, List<File> list) {
this.list = list;
this.save = new ArrayList<File>(list);
this.adapter = adapter;
}
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (prefix == null || prefix.length() == 0) {
// 没有排序的必要
results.values = list;
results.count = list.size();
} else {
String prefisString = prefix.toString().toLowerCase();
final ArrayList<File> valuse = new ArrayList<File>(list);
final int count = valuse.size();
final ArrayList<File> newValues = new ArrayList<File>(count);
for (int i = 0; i < count; i++) {
File file = valuse.get(i);
String s = file.getName().toLowerCase();
if (s.startsWith(prefisString)) {
newValues.add(file);
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
//用来保存历史操作信息
private List<CharSequence> num = new ArrayList<CharSequence>();
private List<List<File>> l = new ArrayList<List<File>>();
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
Log.e("constraint", constraint + "");
List<File> mlist = (List<File>) results.values;
if (mlist == null) {
return;
}
if (constraint != null) {
num.add(constraint);
l.add(mlist);
list.clear();
list.addAll(mlist);
}
for (int i = 0; i < num.size() - 1; i++) {
if (num.get(i).equals(constraint)) {
//这里的list是冲Adapter传递过来的。在改变数据前必须先清除,然后再
//将要显示的数据添加去。
//如果直接将要显示的数据赋值给list,(list=l.get(i))然后在notify.这
//样是不起作用的。原因是,当调用notify后,adapter会检测创建
//Adapter时传递进来的那个对象的数据是否改变。如果直接list=l.get(i)
//这样写,就将list指向另外一个对象。而adapter去检查原来的对象时发
//现数据并没有改变,所以listview不会有变化。解决的办法就是,将list
//清空,然后再把要显示的数据在加载到原来的list里边去。这样就可以
//了。
list.clear();
list.addAll(l.get(i));
num.remove(i);
l.remove(i);
i = num.size();
}
}
if (list.size() > 0) {
// 通知改变
for (File f : list) {
Log.e("", f.getName());
}
//这个函数实际上是调用notifyDataSetChanged。这是我的一个自定义
//方法
adapter.update(list);
} else {
adapter.notifyDataSetInvalidated();
}
}
}
代码片`