Firebase onChildAdded被多次触发

时间:2017-03-06 09:52:43

标签: android firebase firebase-realtime-database

我有一个ListView,每行包含多个EditText和一个保存Button

在ShowOrder中,我从Firebase获取数据

public void getItemsOrderDetails(final String key){

    orderDetailsRef.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            arrayLength = dataSnapshot.getChildrenCount();

            String itemN="", discription="", qty="", pcsCtn="", ctnWt="", compileStatus="", palletN="", ttlCtn="";
            if(!key.equals("costumerName") && !key.equals("dateOfDelivery") && !key.equals("dateOfOrder") && !key.equals("orderN") && !key.equals("remarks") && !key.equals("status")){
                if(dataSnapshot.child(key).hasChild("itemNumber")){
                     itemN= dataSnapshot.child(key).child("itemNumber").getValue().toString();
                }
               ...
               ... {downloading all data}
               ...

                itemsClass= new ItemsClass(orderNumber, itemN, discription, pcsCtn, ttlCtn, ctnWt, qty, compileStatus, palletN );
                itemsClassArrayList.add(itemsClass);
                    adapter.notifyDataSetChanged();

            }

我正在adapter显示所有数据,问题是当我想要更新数据时onChildAdded被多次触发。

这是适配器中的更新部分:

private void updateData(ViewHolder vh, String orderN){

    showOrder.itemsClassArrayList.clear();
        updateStatus="idle";         
    ordersRef.child(orderNumber).child(itemN).child("palletNo").setValue(pallete);
    ordersRef.child(orderNumber).child(itemN).child("pcsPizza").setValue(untCtn);
    ordersRef.child(orderNumber).child(itemN).child("compileStatus").setValue(collected);
    ordersRef.child(orderNumber).child(itemN).child("drink").setValue(ctnWt);
    ordersRef.child(orderNumber).child(itemN).child("ttlWt").setValue(pltWt);
    ordersRef.child(orderNumber).child(itemN).child("ttl").setValue(ttlCtn);
    updateStatus= "update";
    //showOrder.adapter.clear();

}

我发现如果我只更新一个child(删除所有其他人),则onChildAdded只会更新一次。 所以我不明白如果有人作为一个想法,我怎么能更新所有更新,

谢谢

1 个答案:

答案 0 :(得分:0)

这可能不是您问题的完整解决方案,但有些事情让我立刻感到震惊:

您可以(并且应该)在数据库中加载和存储完整的对象,因此您不应单独读取和写入每个子项(例如您的ItemsClass对象),而应该像这样存储项目:

ordersRef.child(orderNumber).child(itemN).setValue(myItem)

其中myItem是之前已用数据填充的ItemsClass的实例。

以类似的方式,加载数据应该这样完成(取决于orderDetailsRef指向的位置!见下文):

public void onDataChange(DataSnapshot dataSnapshot) { 
    ItemsClass items = dataSnapshot.getValue(ItemsClass.class); 
}

另外,你提到多次调用onChildAdded,但在你的例子中,你使用的是ValueEventListener的onDataChange方法。

您能提供完整的代码示例吗?您发布的那个缺少解决方案的相关部分。让我知道您加载并保存我建议的方式时代码的行为。