1、引用是一種數據類型,保存了對象在內存中的地址,這種類型即不是我們平時所說的簡單數據類型也不是類實例(對象);
2、不同的引用可能指向同一個對象,換句話說,一個對象可以有多個引用,即該對象數據類型的變量;
3、改變一個引用的值,其他引用的值也會改變;
4、在java中只有簡單的數據類型,在傳遞的時候是傳遞的值;
通過以上學習解決了最近遇到的數據更新後,MyAdapter刷新問題。
剛開始我是這麼做的:
在Activity中new了一個複雜的數據類型:List<HashMap<String,Object>> data;
一個setData方法:
public void setData(List<HashMap<String, Object>> data) {
MangeTroubleActivity.this.data.clear();
for(HashMap<String, Object> map:data){
this.data.add(map) ;
}
}
MyAdapter也new了一個複雜的數據類型:
List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
寫了set方法:
public void setData(List<HashMap<String, Object>> list) {
this.list = list;
}
在Activity中使用MyAdapter的對象調用setData(data); /*這裏使用的就是傳引用*/
之後在MyAdapter中修改了list後,使用list.clear();清除數據,後使用setData(list)方法放入Activity、MyAdapter改變後的數據,notifyDataSetChanged()更新界面;
這時候發現數據爲空。到底哪裏出了問題呢?
經過測試發現當在list改變後Activity中setData(0的時候傳遞的值爲空了,這時候想應該是 MangeTroubleActivity.this.data.clear(); 的時候把傳過來的數據都清空了,所以設了斷點DeBug一下。果然如此。。。。
那爲什麼會造成清除Activity中data對象,MyAdapter中的list也會改變呢?然後就想到是不是兩個對象引用的是同一個值。
對MyAdapter中set方法做了如下修改
public void setData(List<HashMap<String, Object>> list) {
this.list.addAll(list);
// this.list = list;
}
測試。。。結果數據更新成功,也不會被清除了。這其中的原因就是:通過addAll()方法實例化list對象,java中複雜數據類型傳遞的時候是傳引用,改變一個對象的值,另一個也會跟這變;
在這推薦一個網址
http://blog.csdn.net/houpuhope/article/details/7449377作者對java中什麼情況下傳值,什麼情況下傳引用講的很詳細。