关于BaseAdapter中notifyDataSetChanged 失效的问题

关于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();
}
}
}
代码片`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章