91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-05 23:47:33 來源:網絡 閱讀:5906 作者:bddylww 欄目:開發技術
        學過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;
}
@Override
public 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.clear();
dataList.addAll(getData());
adapter.notifyDataSetChanged();

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的方式,先將數據移除,再重新添加數據或更換新的內存區域指向。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安仁县| 靖州| 克东县| 龙川县| 白河县| 葵青区| 两当县| 湖北省| 乌审旗| 博白县| 乌兰浩特市| 富宁县| 溧阳市| 维西| 玛曲县| 海宁市| 清涧县| 昆山市| 稻城县| 定结县| 察哈| 克拉玛依市| 金门县| 东阳市| 杭锦后旗| 岳阳县| 泰州市| 郎溪县| 沁源县| 洪洞县| 沽源县| 浑源县| 墨脱县| 临湘市| 黑龙江省| 民乐县| 蓝山县| 嫩江县| 乐昌市| 嘉义市| 泰州市|