[項目總結]論Android Adapter notifyDataSetChanged與notifyDataSetInvalidated無效原因

來源:互聯網
上載者:User

標籤:android   c   java   a   資料   使用   

最近在開發中遇到一個問題,Adapter中使用notifyDataSetChanged 與notifyDataSetInvalidated無效,經過思考和網上尋找,得出如下原因。

首先看一下notifyDataSetChanged與notifyDataSetInvalidated的區別

我們可應用糧倉來解釋一下,兩者的區別。

notifyDataSetChanged:糧倉中得糧食少了,或者多了,發送通知。

notifyDataSetInvalidated:糧倉變換了,比如原來從A倉取糧食,現在換成了B糧倉。

 

其次看一下,Java中對象和對象的引用。

java 中使用new 方法建立對象。同時把對象的地址賦值給一個變數。

大家需要明白的是,這個變數,並不是對象,而是儲存物件地址的一個變數。這個有點繞。

還是用糧倉來比喻,new一個對象,就相當於建立了一個糧倉。而這個糧倉的地址就是你聲明的物件變數。

Java中得對象可以說是沒有生命週期這一說法的,因為他只用存在和銷毀兩種狀態。也就是說,對象從建立後,直到被系統回收,是一直存在的。他不會隨著你聲明的變數銷毀而銷毀。

 

明白了以上兩點,我們再分析一下,為什麼Adapter中的兩種方法為什麼不起作用。

還是用糧倉來做比喻吧。

設有糧倉A,我們需要把A中得糧食,顯示出來。

然後,某天運輸隊,運來了一批糧食,這批糧食有兩種方式儲存。

1.把糧食放到A中,也就是我們說得List的Add方法。

2.建立一個糧倉B,把糧食放入B糧倉中。就是代碼中,new List --->add.

就這兩種情況分析一下,為什麼不起作用。

第一種,如果使用notifyDataSetInvalidated,是不會起作用的,因為資料來源沒有變化,就是糧倉還在。這個時候應該使用notifyDataSetChanged。糧倉中得糧食變了。

第二種,這是最複雜的,大部分不起作用都發生在這種情況下。

分析:notifyDataSetChanged不起作用的原因,是因為A糧倉中糧食沒有發生變化。Adapter中仍然保持是對A糧倉的地址引用。

notifyDataSetInvalidated不起作用的原因,是因為,Adapter中得變數仍然是保持對A的引用,沒有改變引用地址。

 

解決方案:第一種情況,基本不會出問題。

主要是第二種:如果資料對象,是重新new的對象,並且把引用賦值給要顯示的List時,要通知Adapter資料來源發生了變化。比如重新setList(),並使用notifyDataSetInvalidated。

 

其實一切的原因都是Java中對象和引用的理解。有時間再寫例子吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.