淺析:ListView的動態刷新問題

也許不少開發的朋友,尤爲是Android初學者,在動態刷新ListView時,使用notifyDataSetChanged並無起到做用。有時會被困擾得很痛苦。工具

 

其實,在使用notifyDataSetChanged過程當中,仍是有細節須要注意的。舉個例子:測試

 

個人ListView使用的數據源是來自ArrayList。一般咱們的作法是建立一個已經有咱們想要提供給ListView的數據的ArrayList,例如:spa

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

2 list.add(1);開發

 

這裏咱們的list已是指向了一個堆內存上了。接着咱們想要改變list中的數據,而這個時候,就須要注意了,舉個例子:咱們在代碼中有另一個ArrayList叫作newlist,它是使用下面代碼建立出來的:get

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

2 list.add(2);自動化

 

這個時候,newlist指向的是一個和list指向不一樣的堆內存,這個時候,咱們直接用list = newlist來把newlist的數據交給list,在這裏,實際上只是把list的指向改變了,讓它也指向newlist指向的那個內存。那麼這個時候咱們再調用notifyDataSetChanged這個方法來通知listview更新數據就起不了任何做用了,緣由很簡單,就是list的指向已經改變,而調用notifyDataSetChanged會去檢查原來list指向的數據是否變化,可是這時的list已經不是原來的list了,因此它沒法判斷,只能不做出響應了。那麼,這個問題的解決方法是直接在原來的list上面更改數據,可使用下面的代碼來操做:自動化測試

1 list.clear();List

2 list.addAll(newlist);

3 adapter.notifyDataSetChanged();

 

這樣,list的指向就不會改變,它仍是指向原來那塊內存,這樣調用notifyDataSetChanged()就能夠起做用了。

 

總結:在這裏的重點就是要注意在開始時傳給ListViewlist指向不能被改變,須要從始至終指向同一個內存,這樣調用notifyDataSetChanged後就可以檢測到list的數據變化,從而觸發ListView的從新繪製了!另外,我在開發完APP都會用一些APP在線自動化測試工具進行測試:www.ineice.com

相關文章
相關標籤/搜索