Adapter.notifyDataSetChanged()不起作用

今天在使用RecyclerView過程中adapter.notifyDataSetChanged()不起作用,通過Logcat打印發現數據源變化了,但是視圖一直沒變,後面發現是list集合在內存中的地址變了。原來使用 adapter.notifyDataSetChanged() 時,必須保證傳進 Adapter 的數據 List 是同一個 List 而不能是其他對象,否則無法更新 RecyclerView

之前的寫法是:


JsonObject jsonObject = new JsonParser().parse(msg.obj.toString()).getAsJsonObject();
if (jsonObject.get("success").getAsBoolean()) {
    jsonArray = jsonObject.get("data").getAsJsonObject().get("list").getAsJsonArray();
    collectionRecyclerAdapter.notifyDataSetChanged();
    LogUtils.e("snotifyDataSetChanged時jsonArray的地址: " + jsonArray.hashCode());
} else {
    ToastUtils.showShort(mContext, "您還沒有收藏任何文章");
}

這裏數據源jsonArray確實變了,但這種重新賦值的方式讓該集合在內存中的地址也變了, 調用notifyDataSetChanged()方法自然不會刷新界面

修改後的寫法:


JsonObject jsonObject = new JsonParser().parse(msg.obj.toString()).getAsJsonObject();
if (jsonObject.get("success").getAsBoolean()) {
    JsonArray jsonArray1 = jsonObject.get("data").getAsJsonObject().get("list").getAsJsonArray();
    jsonArray.addAll(jsonArray1);
    collectionRecyclerAdapter.notifyDataSetChanged();
    LogUtils.e("snotifyDataSetChanged時jsonArray的地址: " + jsonArray.hashCode());
} else {
    ToastUtils.showShort(mContext, "您還沒有收藏任何文章");
}

這裏新創建了一個數據類作爲中間容器存儲獲取到的數據,然後再調用jsonArray.add()方法,這種形式原數據源的內存地址沒有改變,所以adapter.notifyDataSetChanged()就會刷新界面。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章