天天看點

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()就會重新整理界面。

繼續閱讀