我有一个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
只会更新一次。
所以我不明白如果有人作为一个想法,我怎么能更新所有更新,
谢谢
答案 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方法。
您能提供完整的代码示例吗?您发布的那个缺少解决方案的相关部分。让我知道您加载并保存我建议的方式时代码的行为。