android 適配器notifyDataSetChanged無法刷新問題解決

       因爲剛接觸Android,今天在項目中使用listView時出現了一個無法通過適配器notifyDataSetChanged刷新的問題,項目大概功能是首先從接口中獲取一組數據在listView中顯示,然後在進行某一系列操作後。又需要重新從接口獲取數據然後展示在listView中。大概功能就是這樣,下面我寫了一個簡單的Demo。數據功能的形式也大概是這樣

       List<String> list = new String[]{"listView item"};
       ArrayAdapter<String> adapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
       listView.setAdapter(adapter);
       list = new String[]{"new listView item"};
       adapter.notifyDataSetChanged();

     我相信大家也都能看懂上面的邏輯,我就不說明了。然後之前我一般都是使用的add()來添加數據然後notifyDataSetChanged來進行刷新。所以也沒去關注源碼,後來看了adapter相關的源碼如下圖

           

     由此我們可以得知這個notifyDataSetChanged的時候它創建了一個數組,所以說adapter監聽的是它之前傳入的數組的變化也就是new String[]{"listView1 item"},而不是list。之前我一直以爲是監聽的list變化,換一種說法也就是adapter本身會保存一個對原始數據源(new String[]{"listView1 item"})的內部引用mObservers然後對它進行監聽並刷新,上面Demo中我是重新new的一個list集合,所以無法使用notifyDataSetChanged來進行刷新。list = new String[]{"new listView1 item"};這相當於切斷了list與原始數據源(new String[]{"listView item"};)的關係,因此之後調用notifyDataSetChanged並不會起作用,因爲list 和mObservers已經是存在於堆上的完全不同的兩個list集合了

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章