關於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();
}
}
}
代碼片`

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