【发布时间】:2017-01-31 11:17:44
【问题描述】:
我的 recyclerview 的每个项目都有一个数量选择器。滚动时,数量值会因回收而改变。因此,我正在尝试使用最新值更新地图,并在删除或更改孩子时使用该位置通知ItemChanged。
我正在使用 ChildEventListener 来监听孩子的变化。但是当单个更改发生时 onChildChanged 会继续打印 util onDestroy 被调用。
我该如何解决这个问题?请指导我...
private void cartListener(int pos) {
cartRef = mCustDB.child(Email).child("mycart");
cartRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Timber.d("onChildChanged > " + dataSnapshot.getKey());
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
LOGCAT
01-31 16:34:58.759 27963-27963/? D/BrowsePresenter: onChildChanged > c02p02
01-31 16:34:58.782 27963-27963/? D/BrowsePresenter: onChildChanged > c02p02
01-31 16:34:59.399 27963-27963/? D/BrowsePresenter: onChildChanged > c02p02
01-31 16:34:59.409 27963-27963/? D/BrowsePresenter: onChildChanged > c02p02
01-31 16:35:00.055 27963-27963/? D/BrowsePresenter: onChildChanged > c02p02
01-31 16:35:01.959 27963-27963/? D/BrowsePresenter: onChildChanged > c02p02
01-31 16:35:01.970 27963-27963/? D/BrowsePresenter: onChildChanged > c02p02
01-31 16:35:02.599 27963-27963/? D/BrowsePresenter: onChildChanged > c02p02
注意
我只更改一次数据。但是对于每次更改,方法都会不停地触发,直到我删除侦听器!
更新
问题在于addToCart 方法,因为如果我直接在firebase 中更新值。侦听器仅被触发两次。
如果我使用以下方法更新值。在我删除侦听器之前,它会被多次触发。
public void addToCart(Product item, int quantity, int position) {
cartRef = mCustDB.child(Email).child("mycart");
cartRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String prodID = null;
List<String> mKey = new ArrayList<>();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
prodID = postSnapshot.getKey();
mKey.add(prodID);
}
if (!mKey.contains(item.productID())) {
Cart mycart = new Cart(item.productID(), 1);
cartRef.updateChildren(mycart.toMap());
Timber.d("updateChildren >> ");
} else {
if (quantity == 0) {
Timber.d("Remove >> " + item.productID());
cartRef.child(item.productID()).removeValue();
} else {
Timber.d("INCREASE >> " + item.productID() + quantity);
cartRef.child(item.productID()).setValue(quantity);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
购物车
public class Cart {
public String productID;
public int quantity = 0;
public Cart() {
}
public Cart(String productID, int quantity) {
this.productID = productID;
this.quantity = quantity;
}
public Cart(String productID) {
this.productID = productID;
}
@Exclude
public Map<String, Object> toMap() {
HashMap<String, Object> result = new HashMap<>();
result.put(productID , quantity);
return result;
}
}
【问题讨论】:
-
是的,只要firebase的数据库发生变化,就会调用onChildChanged()方法。
-
@RishabhMahatha 我只更改了一次数据。但是方法多次触发
-
你如何调用
cartListener()方法以及如何更改数据?我不认为到目前为止发布的代码是问题的原因。 -
@LewisMcGeary 请查看更新!
-
如果
onChildChanged()被多次调用,很可能您多次更改了/a child。请分享minimal complete code that reproduces this problem。如果这需要您的Cart课程,请分享。但很可能你也可以在没有Cart类和简单的地图的情况下重现它(如果你不能,你知道问题出在你的Cart类:-))。
标签: android firebase firebase-realtime-database