亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

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

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

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

代碼段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控件進行綁定。

代碼段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);}

上述代碼是通過上下文環境和數據列表來構造適配器,并且重寫其getItem()方法。在此需要明白的是list成員變量是適配器中的私有變量,getItem()方法是當數據顯示在ListView時會回調的方法,或者說當顯示數據或數據發生改變重寫加載數據時會回調這個方法(當然還會調用getView()方法,此時不再贅述)。 代碼段3~6模擬數據改變: 代碼段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', '成熟穩重高富帥'); 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', '成熟穩重高富帥'); data.add(Mryang); return data;}

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

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

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

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

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

代碼段5簡易模型

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

代碼段6簡易模型 因此當我們想要更換ListView中的所有數據時,應該采用代碼段6的方式,先將數據移除,再重新添加數據或更換新的內存區域指向。

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

標簽: Android
相關文章:
主站蜘蛛池模板: 久久是免费只精品热在线 | 国产综合精品在线 | 一级毛片在线完整免费观看 | 国产一区二区在线观看视频 | 五月婷婷色视频 | 黄性色 | 搞黄视频在线观看 | 在线500福利视频国产 | 好大好爽国产美女h福利视频 | 日韩经典欧美精品一区 | 综合网在线视频 | 国产成人爱片免费观看视频 | 三级全黄a | 99久久精品国产麻豆 | 成人午夜在线播放 | 欧美成人免费草草影院 | 日韩精品a在线视频 | 精选国产门事件福利在线观看 | 日韩一级影院 | 日本免费毛片 | 国产日韩亚洲欧美 | 国产午夜毛片一区二区三区 | 国产精品二区页在线播放 | 俄罗斯美女bbbbxx | 欧美色片在线观看 | 香港三级理论在线观看网站 | 久久综合一区二区三区 | 在线观看一区 | 激情视频网站在线观看 | 国产美女主播在线观看 | 国产主播在线看 | 免费特黄一级欧美大片在线看 | 一道本不卡免费视频 | 一级影院 | 国外成人在线视频网站 | 天天拍夜夜添久久精品中文 | 色综合99| 亚洲日本va在线观看 | 欧美特黄a级高清免费看片 欧美特黄a级猛片a级 | 亚洲美女激情 | 亚洲国产日韩综合久久精品 |