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