2017-03-06 59 views
0

我有一个ListView,每行包含多个EditText和保存ButtonFirebase onChildAdded正在多次触发

在ShowOrder activty我正在从火力地堡

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是beeing多次触发数据。

这是适配器更新部分:

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将只更新一次。 所以我不明白我如何更新所有出多个更新,如果任何人作为一个想法。

谢谢

回答

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方法。

您能给出一个完整的代码示例吗?您发布的内容缺乏解决方案的相关部分。让我知道你的代码在加载和保存我建议的方式时的行为。