Android ArrayList覆盖值而不是附加到列表

时间:2017-12-04 00:03:25

标签: java android arraylist

我尝试使用新数据更新和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

2 个答案:

答案 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是同一个对象。我希望我的回答能帮助你