天天看點

淺析:ListView的動态重新整理問題

也許很多開發的朋友,尤其是Android初學者,在動态重新整理ListView時,使用notifyDataSetChanged并沒有起到作用。有時會被困擾得很痛苦。

其實,在使用notifyDataSetChanged過程中,還是有細節需要注意的。舉個例子:

我的ListView使用的資料源是來自ArrayList。通常我們的做法是建立一個已經有我們想要提供給ListView的資料的ArrayList,例如:

1 ArrayList<Integer> list  = new ArrayList<Interger>;

2 list.add(1);

這裡我們的list已經是指向了一個堆記憶體上了。接着我們想要改變list中的資料,而這個時候,就需要注意了,舉個例子:我們在代碼中有另外一個ArrayList叫做newlist,它是使用下面代碼建立出來的:

1 ArrayList<Integer> newlist  = new ArrayList<Interger>;

2 list.add(2);

這個時候,newlist指向的是一個和list指向不同的堆記憶體,這個時候,我們直接用list = newlist來把newlist的資料交給list,在這裡,實際上隻是把list的指向改變了,讓它也指向newlist指向的那個記憶體。那麼這個時候我們再調用notifyDataSetChanged這個方法來通知listview更新資料就起不了任何作用了,原因很簡單,就是list的指向已經改變,而調用notifyDataSetChanged會去檢查原來list指向的資料是否變化,但是這時的list已經不是原來的list了,是以它無法判斷,隻能不作出響應了。那麼,這個問題的解決方法是直接在原來的list上面更改資料,可以使用下面的代碼來操作:

1 list.clear();

2 list.addAll(newlist);

3 adapter.notifyDataSetChanged();

這樣,list的指向就不會改變,它還是指向原來那塊記憶體,這樣調用notifyDataSetChanged()就可以起作用了。