我尝试使用新数据更新和ArrayList
- 但是当我尝试这样做时 - 之前的数据会被覆盖,新数据永远不会附加到列表中,我就是不确定为什么。
if (keylist.contains(item) && !value.equals("start") && !value.equals("stop") && !value.equals("done")){
final Integer number = keylist.indexOf(item);
this.runOnUiThread(new Runnable() {
@Override
public void run() {
// GET PREVIOUS VALUES
String previous_key = App.sharedPrefs.getString(LIVE_VIEW_KEY, null);
String previous_value = App.sharedPrefs.getString(LIVE_VIEW_VALUE, null);
// ADD NEW AND OLD VALUES TO LIST
mCallElements.clear();
mCallElements.add(new CallElement(previous_key, previous_value));
mCallElements.add(new CallElement(valuelist.get(number), value));
mAdapter.notifyDataSetChanged();
// SAVE NEW VALUES
final SharedPreferences.Editor editor = App.sharedPrefs.edit();
editor.putString(LIVE_VIEW_KEY, valuelist.get(number));
editor.putString(LIVE_VIEW_VALUE, value);
editor.apply();
}
});
}
P.S。
这是Twilio
聊天实施的一部分 - 完整来源可以在这里看到:https://pastebin.com/imNQdCJ0
答案 0 :(得分:1)
您正在使用.clear()
清除ArrayList,然后调用.notifyDataSetChanged()
。这将清除最后一组数据,然后强制适配器完全重新加载。
为了让您的开发人员生活变得更加轻松,我建议您使用DiffUtil
。这会计算两个列表之间的差异,并为您处理更改。有关如何实现这一点的非常好的教程可以在CodePath上找到:https://guides.codepath.com/android/using-the-recyclerview#diffing-larger-changes
Android文档说:
'依靠notifyDataSetChanged()作为最后的手段'
但由于DiffUtil
你不再需要关心。
答案 1 :(得分:0)
我认为如果您只想将新数据添加到旧数据中,则无需使用mCallElements.clear()
,如果notifydatachanged仍未更新数据,我认为您需要检查您的ArrayList是同一个对象。我希望我的回答能帮助你