2013-02-26 51 views
0

當您創建擴展ArrayAdapter<T>自定義適配器,它通常有以下形式:的Android的ListView適配器的數據,mantaining一致性

public class ListAdapter extends ArrayAdapter<Item> { 

    private List<Item> mData; 

    public ListAdapter(Context context, int resource, List<Item> data) { 
     super(context, resource, data); 
     mData = data; 
    } 
} 

數據最初保存在一個私有成員mData,也是ArrayAdapter保存數據在其自己的會員mObjects。我很確定那些不是真正的副本,而是對同一個列表的引用。
現在,,這是我的問題,如果的ListView處理過程中,由於某種原因,你有一個全新的列表,以取代自己的列表,我想你也應該這樣做:

mData = new List<Item>(); 
super.clear(); 
super.addAll(mData); 

否則在ListView中將沒有一致性,像getFilter()。filter()這樣的方法將不起作用。

我說得對嗎?

回答

2

我想,當你說MDATA =數據;它只複製數據數組的指針,因爲當你執行它時;

ListAdapter adapter = new ListAdapter(context, resource, data); 
data.clear(); 
adapter.notifyDataSetChanged(); 

它改變列表。所以它保持你的源數組的指針,

第二,我認爲(不知道)你不能使用適配器的過濾功能,至少我不能使用和編寫我自己的過濾功能。我從sqlite中過濾元素(我從數據庫中獲取元素)。並使用適配器的notifyDataSetChanged函數。

+0

@streetsofboston在你看來,如果不是'data.clear()'你執行'data = null',你會怎麼做? :::我提前道歉,我知道這不是一個討論論壇,所以也許最好是標記一個aswer,並把這個問題放在可以討論的地方。 – ilomambo 2013-02-26 20:20:29

+0

「data = null;」不會爲ListAdapter做任何事情。 – 2013-02-27 14:13:29

-1

你真正需要的不是很確定它是否真實副本或沒有,只是延長BaseAdapter

+0

對不起,我不明白你在說什麼。你能詳細說明嗎? :::你的回答看起來像一個評論,而不是一個答案。 – ilomambo 2013-02-26 15:04:25

2

你是對的。您的ListAdapter不會提供Items提供的清單的深層副本。這意味着如果將Item實例更改爲「ListAdapter以外」,將會使ListAdapter處於無效狀態。

但是,您可以通過調用ListAdapter上的notifyDataSetChanged來「解決」此問題。

List<Item> itemList = .... 
.... 
.... 
ListAdapter adapter = new ListAdapter(this, R.layout.somelayout, itemList); 
.... 

現在,如果你改變一個項目「外部」的ListAdapter,你仍然可以使你的ListAdapter保持同步與變化:

itemList.get(idx).changeSomethingInItem("Hello"); // Changes the Item at index 'idx'. 
adapter.notifyDataSetChanged();     // Notify adapter about this change.