1. 程式人生 > >Android ListView中notifyDataSetChanged()重新整理資料不更新原因

Android ListView中notifyDataSetChanged()重新整理資料不更新原因

使用Listview的時候: 當要動態顯示更改後的資料(例如資料庫改動), 很多人應該都用過notifyDataSetChanged();這個方法來重新整理Listview,顯示改後的資料.

這時候就要注意了:
                 ......
                 private ArrayList<HashMap<String, Object>> usersList;
                 ......
                 usersList= query(......);     //根據查詢函式獲取一個ArrayList並賦值給繫結到Adapter的資料來源usersList


                 sAdapter.notifyDataSetChanged();
                 ......

           如果你也是:   上面這種形式去重新整理ListView的資料的話, 是不可以更新的. 必須改成如下形式:

                 ......
//usersList= query(......);   
                 usersList.clear();  
                 usersList.addAll(query(......));
                 sAdapter.notifyDataSetChanged();


///////////////////////////////////////////////////////////////////////////////////////

         原 因是:    sAdapter會通過usersList獲取List中的內容。但是實際上可能(也應該)是,在呼叫 super(MyActivity.this, R.layout.item, usersList)時sAdapter儲存了usersList指向原 List(假設為List a)的引用,在呼叫query函式之後,usersList指向了一個新的List(List b)。但是在呼叫 notifyDataSetChanged()時,sAdapter會跟據儲存的引用(即指向List a的引用)去更新,因此當然還是原來的結果,不會 進行更新。


如果大家也出現這種情況可以使用後者去重新整理ListView, 應該就沒問題了