今天在使用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()就會刷新界面。