或許非常多開發的朋友。尤其是Android剛開始學習的人,在動態刷新ListView時。使用notifyDataSetChanged並沒有起到作用。
有時會被困擾得非常痛苦。
事實上,在使用notifyDataSetChanged過程中,還是有細節須要注意的。舉個樣例:
我的ListView使用的數據源是來自ArrayList。
通常我們的做法是創建一個已經有我們想要提供給ListView的數據的ArrayList,比如:
ArrayList<Integer> list = new ArrayList<Interger>; list.add(1);這里我們的list已經是指向了一個堆內存上了。
接着我們想要改變list中的數據,而這個時候。就須要注意了,舉個樣例:我們在代碼中有另外一個ArrayList叫做newlist,它是使用以下代碼創建出來的:
ArrayList<Integer> newlist = new ArrayList<Interger>; list.add(2);
這個時候,newlist指向的是一個和list指向不同的堆內存,這個時候。我們直接用list = newlist來把newlist的數據交給list,在這里,實際上僅僅是把list的指向改變了。讓它也指向newlist指向的那個內存。
那么這個時候我們再調用notifyDataSetChanged這種方法來通知listview更新數據就起不了不論什么作用了。原因非常easy,就是list的指向已經改變。而調用notifyDataSetChanged會去檢查原來list指向的數據是否變化。可是這時的list已經不是原來的list了。所以它無法推斷。僅僅能不作出響應了。那么。這個問題的解決方法是直接在原來的list上面更改數據,能夠使用以下的代碼來操作:
list.clear(); list.addAll(newlist); adapter.notifyDataSetChanged();這樣。list的指向就不會改變,它還是指向原來那塊內存。這樣調用notifyDataSetChanged()就能夠起作用了。
總結:在這里的重點就是要注意在開始時傳給ListView的list指向不能被改變。須要從始至終指向同一個內存。這樣調用notifyDataSetChanged后就行檢測到list的數據變化,從而觸發ListView的又一次繪制了!