Android 之 adapter.notifyDataSetChanged() 無響應

QinGeneral發表於2014-08-30

今天開發Android遇到一個問題,就是adapter.notifyDataSetChanged() 後,列表並無變化。第一開始的程式碼片段是這樣的:(簡化後的,大家知道意思即可)

listItem = new ArrayList(); //listItem 為儲存List中每個item的值的變數。

adapter.notifyDataSetChanged() ;

為了找出原因,我把listItem = new ArrayList(); 改為listItem.remove(0);或者listItem.clear();發現列表做出了相應的變化。

總結以下三個要點:

1.    這兩個的區別是:listItem = new ArrayList()  並未改變源資料,而是新建立一個資料段,並將這個新資料段的引用賦給listItem(因為listItem是一個引用)。源資料依舊存在且沒有發生變化。而remove(),clear()方法,是改變了源資料。

2.    Adapter在初始化時,比如SimpleAdapter simpleAdapter = new SimpleAdapter(context,  List<E>, xml_id, String[], int[] );其中,List<E>是傳遞的資料,而因為List在傳遞時,傳遞的是引用,所以,listItem = new ArrayList() 並未改變Adapter中指向的資料。

3.    notifyDataSetChanged()方法檢測的是Adapter初始化時傳遞的引用的資料是否改變,而不是listItem所指向的資料是否改變。這也導致了列表沒有發生變化。


解決後的程式碼:

listItem.clear();

listItem.add(new ArrayList());

adapter.notifyDataSetChanged() ;

還有一種使用notifyDataSetInvalidated()方法可使用,在此不再深究。


以上敘述如有差誤,請大家指出,謝謝!

相關文章