av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

淺談Android中適配器的notifyDataSetChanged()為何有時不刷新

瀏覽:9日期:2022-09-23 10:43:48

學(xué)過Android開發(fā)的人都知道,ListView控件在開發(fā)中經(jīng)常遇到,并且ListView通常結(jié)合Adapter適配器來進(jìn)行數(shù)據(jù)顯示和數(shù)據(jù)更新操作。姑且假設(shè)數(shù)據(jù)存儲在名為dataList的成員變量中。數(shù)據(jù)操作無非是增加數(shù)據(jù)、刪除數(shù)據(jù)這兩種主要的操作,而當(dāng)數(shù)據(jù)有所變化時,為了及時向用戶提供更新后的數(shù)據(jù),我們知道需要在數(shù)據(jù)更新后調(diào)用適配器的notifyDataSetChanged()方法,來顯示更新后的數(shù)據(jù)。殊不知,該方法并非百試不爽,在此我們便來討論下具體的原因,其實本質(zhì)是關(guān)注內(nèi)存的分配情況。 先來看幾段代碼。

代碼段1(某Activity中):

private List<Map<String,String>> dataList;private ListView listView;private ListAdapter adapter;listView = findViewById(R.id.mancard);adapter = new ListAdapter(this, dataList);listView.setAdapter(adapter);

上述代碼是把Adapter適配器和ListView控件進(jìn)行綁定。

代碼段2(ListAdapter中的部分代碼):

public class ListAdapter extends BaseAdapter{private Context context;private List<ArrayList> list;ListAdapter(Context context, List list){ this.context = context; this.list = list;}@Overridepublic Object getItem(int position) { return list.get(position);}

上述代碼是通過上下文環(huán)境和數(shù)據(jù)列表來構(gòu)造適配器,并且重寫其getItem()方法。在此需要明白的是list成員變量是適配器中的私有變量,getItem()方法是當(dāng)數(shù)據(jù)顯示在ListView時會回調(diào)的方法,或者說當(dāng)顯示數(shù)據(jù)或數(shù)據(jù)發(fā)生改變重寫加載數(shù)據(jù)時會回調(diào)這個方法(當(dāng)然還會調(diào)用getView()方法,此時不再贅述)。 代碼段3~6模擬數(shù)據(jù)改變: 代碼段3

dataList.remove(1);adapter.notifyDataSetChanged();

代碼段4:

Map vivian = new HashMap();vivian.put('sex', 'girl');vivian.put('nick', 'vivian');vivian.put('content', '陽光魅力大方無極限');dataList.add(vivian);adapter.notifyDataSetChanged();

代碼段5:

dataList = getData();adapter.notifyDataSetChanged();private List getData(){ List data = new ArrayList(); Map vivian = new HashMap(); vivian.put('sex', 'girl'); vivian.put('nick', 'vivian'); vivian.put('content', '陽光魅力大方無極限'); data.add(vivian); Map Mryang = new HashMap(); Mryang.put('sex', 'boy'); Mryang.put('nick', '楊陽洋'); Mryang.put('content', '成熟穩(wěn)重高富帥'); data.add(Mryang); return data;}

代碼段6:

dataList = getData();adapter.notifyDataSetChanged();private List getData(){ List data = new ArrayList(); Map vivian = new HashMap(); vivian.put('sex', 'girl'); vivian.put('nick', 'vivian'); vivian.put('content', '陽光魅力大方無極限'); data.add(vivian); Map Mryang = new HashMap(); Mryang.put('sex', 'boy'); Mryang.put('nick', '楊陽洋'); Mryang.put('content', '成熟穩(wěn)重高富帥'); data.add(Mryang); return data;}

getData()方法同代碼段5(略)

以上幾種情況模擬了常用的更新數(shù)據(jù)的方法,在這幾種情況種代碼段5不能實現(xiàn)數(shù)據(jù)的更新操作,代碼段3、4、6可以實現(xiàn)數(shù)據(jù)更新操作。為什么代碼段3、4、6可以更新,原因大家都明白,是因為數(shù)據(jù)發(fā)生了變化,因此當(dāng)調(diào)用adapter.notifyDataSetChanged()方法時就會把更新后的數(shù)據(jù)顯示出來。代碼段5的數(shù)據(jù)也發(fā)生了變化,為什么不能實現(xiàn)數(shù)據(jù)更新呢?當(dāng)構(gòu)造Adapter適配器,數(shù)據(jù)列表dataList傳遞過去時,是把dataList指向的地址副本作為參數(shù)傳遞給了adapter中的list成員變量了,因此dataList指向的內(nèi)存區(qū)域和adapter中l(wèi)ist指向的內(nèi)存區(qū)域是同一塊內(nèi)存區(qū)域,代碼段3和代碼段4對數(shù)據(jù)的添加、刪除操作是在當(dāng)前區(qū)域內(nèi)進(jìn)行的,dataList中數(shù)據(jù)的變化直接影響了adapter中l(wèi)ist的數(shù)據(jù)的變化,因此adapter中的list能夠敏感的發(fā)現(xiàn)數(shù)據(jù)發(fā)生變化。

淺談Android中適配器的notifyDataSetChanged()為何有時不刷新

代碼段3、4簡易模型 代碼段5中,對dataList的內(nèi)存指向做了修改,但是該指向并沒有通知到adapter中的list,也就是說list指向沒有發(fā)生變化,還是指向原來修改前的內(nèi)存區(qū)域,因此dataList的改變并不能引起list的改變,本質(zhì)上來說list沒有發(fā)現(xiàn)數(shù)據(jù)有變化,所以當(dāng)調(diào)用adapter.notifyDataSetChanged()方法時,數(shù)據(jù)沒有更新。而在代碼段6中,首先移除dataList中的數(shù)據(jù),那么adapter中的list自然能夠及時發(fā)現(xiàn)數(shù)據(jù)發(fā)生了變化,從而重新從dataList中得到改變后的數(shù)據(jù)信息,因此當(dāng)調(diào)用adapter.notifyDataSetChanged()方法時能夠發(fā)生數(shù)據(jù)的更新。

淺談Android中適配器的notifyDataSetChanged()為何有時不刷新

代碼段5簡易模型

淺談Android中適配器的notifyDataSetChanged()為何有時不刷新

代碼段6簡易模型 因此當(dāng)我們想要更換ListView中的所有數(shù)據(jù)時,應(yīng)該采用代碼段6的方式,先將數(shù)據(jù)移除,再重新添加數(shù)據(jù)或更換新的內(nèi)存區(qū)域指向。

到此這篇關(guān)于淺談Android中適配器的notifyDataSetChanged()為何有時不刷新的文章就介紹到這了,更多相關(guān)Android 適配器 notifyDataSetChanged()不刷新內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 成人一区二区三区视频 | 武道仙尊动漫在线观看 | 91精品国产色综合久久不卡98 | 国产精品久久久久永久免费观看 | 久久亚洲精品国产精品紫薇 | 永久网站| 蜜桃av一区二区三区 | 亚洲精品短视频 | 久久久人成影片免费观看 | 亚洲精品视频一区二区三区 | 国产精品一区一区 | 九九综合九九 | 亚洲网址在线观看 | 成人在线播放网址 | h片在线播放 | 干干干操操操 | av官网在线 | 国产精品区二区三区日本 | 国产精品毛片 | 一级毛片观看 | 欧美精品久久久久 | 亚洲一区自拍 | 综合久久亚洲 | 久久国产视频网 | 欧美一区二区三区久久精品 | 久久99精品久久久久久国产越南 | 亚洲女优在线播放 | 91丨国产 | 九一视频在线观看 | 午夜免费网站 | 97精品超碰一区二区三区 | 中文字幕中文字幕 | 亚洲成人综合社区 | 成年人黄色一级毛片 | 精品视频一区二区三区在线观看 | 国内自拍偷拍一区 | 日韩在线播放第一页 | 久久久av中文字幕 | 日韩成人影院在线观看 | 浴室洗澡偷拍一区二区 | 国产精品精品久久久久久 |