在onChildChanged中调用ArrayList set方法会创建具有更新记录的重复记录

时间:2018-08-04 18:14:05

标签: android firebase arraylist

    ArrayList<String> mKeys = new ArrayList<>();
    ArrayList<Complaint> objectItems = new ArrayList<>();



public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    String key_use = dataSnapshot.getKey();
                    mKeys.add(key_use);
                    //some codes

                    objectItems.add(0, objectItem);
                    customListAdapter.notifyDataSetChanged();
                }
        }

 public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                String key_use = dataSnapshot.getKey();
                int index = mKeys.indexOf(key_use);

                //some codes
                objectItems.set(index, objectItem);
                customListAdapter.notifyDataSetChanged();

        }

这很好用,但是onChildChanged中的set方法在更新记录后会创建重复的记录。它应该仅在该特定索引处更新记录

2 个答案:

答案 0 :(得分:0)

您要在列表的末尾添加密钥,并在列表的开头添加对象。因此他们俩的位置不同

请将您的代码更改为

$('.sidebar a').click(function() {
  sessionStorage.scrollTop = $('.sidebar').scrollTop();
});

if (sessionStorage.scrollTop != "undefined") {
  $('.sidebar').scrollTop(sessionStorage.scrollTop);
}

答案 1 :(得分:0)

如果您使用过

  

FieldValue.serverTimestamp()

当您将其发送到数据库时。

它将同时创建子级serverTimestamp()子级,然后在onChildAdded上触发,然后在onChildChanged下触发。

弗兰克·范·普菲伦(Frank van Puffelen)在这里说firebase.database.ServerValue.TIMESTAMP fires child_changed twice, which one is correct?

  

第一个值是客户端估计。第二个值是来自服务器的值。除此之外,还不清楚您要问什么。如果没有看到能再现您要解决的问题的最小代码,就不可能说更多。 –弗兰克·范普菲伦

这就是为什么您有重复的记录。