所以我有一个 recyclerView with viewHolder ,允许用户喜欢/不喜欢一个项目。单击该图标外部时,我们会显示页面详细信息;哪个工作正常。 (见下图)
问题:我有一个"喜欢"列出喜欢的项目的活动,当不知道其中一个项目时,相应的项目应该在触发onChildRemoved时消失。不幸的是,我意识到onChildRemoved是在unliking方法之前触发的。
修改 - 澄清:不受欢迎的方法会从Firebase数据库中删除该项目;但是没有"刷新"在UI上,该项目仍在那里。
问题:如何在onChildRemoved之前触发unliking方法?或者我应该实现另一个监听器,但是如何?
在Logs:
中显示的序列下方07-01 16:21:30.761 17802-17802/com.yatoo V/com.item: in on Child Added
07-01 16:21:30.761 17802-17802/com.yatoo V/com.item: Get Updates Called
07-01 16:21:36.731 17802-17802/com.yatoo V/com.item: in on Child Removed
07-01 16:21:36.731 17802-17802/com.yatoo V/com.item: Get Updates Called
07-01 16:21:36.911 17802-17802/com.yatoo V/com.item: Viewholder in on complete Unlike - Item Removed
喜欢/不同的方法在视点中
@Override
public void liked(LikeButton likeButton) {
mFirebaseRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference queryRef = mFirebaseRef.child("users").child(UserUID).child("favorites").child(item.getUniqueID());
queryRef.setValue(item, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError firebaseError, DatabaseReference firebase) {
if (firebaseError != null) {
Utils.showSnack(itemView, R.string.error_data_not_saved +" "+firebaseError.getMessage());
}
}
});
}
@Override
public void unLiked(LikeButton likeButton) {
mFirebaseRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference queryRef = mFirebaseRef.child("users").child(UserUID).child("favorites").child((item.getUniqueID()));
queryRef.setValue(null, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
Log.v(Constants.LOG_TAG, "Viewholder: in on complte Unlike");
Utils.showSnack(itemView, context.getString(R.string.item_favorite_removed));
}
});
queryRef.removeValue();
}
这是带有" getUpdates"的recyclelerView代码。以下方法
RecyclerView favoritesRecyclerView = (RecyclerView)findViewById(R.id.favorites_recyclerview);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
favoritesRecyclerView.setLayoutManager(gridLayoutManager);
userUID = SharedPreferenceManager.getUserUid(this);
mUserFirebase = FirebaseDatabase.getInstance().getReference().child("users").child(userUID).child("favorites");
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.v(Constants.LOG_TAG, "in on Child Added");
getUpdates(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Log.v(Constants.LOG_TAG, "in on Child Changed");
getUpdates(dataSnapshot);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.v(Constants.LOG_TAG, "in on Child Removed");
getUpdates(dataSnapshot);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.v(Constants.LOG_TAG, "in on Child Moved");
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
mUserFirebase.addChildEventListener(childEventListener);
itemList = new ArrayList<>();
itemAdapter = new ItemAdapter(this);
itemAdapter.setListener(this);
favoritesRecyclerView.setAdapter(itemAdapter);
}
活动中的相应getUpdates方法
public void getUpdates(DataSnapshot dataSnapshot){
itemList.clear();
if (dataSnapshot.getChildrenCount() > 0) {
Log.v(Constants.LOG_TAG, "Get Updates Called");
Item item = dataSnapshot.getValue(Item.class);
itemList.add(item);
itemAdapter.refreshItem(itemList);
}
}
答案 0 :(得分:0)
我终于想出了一个解决方案。 我在适配器中实现了一个监听器,一切顺利。