【发布时间】:2017-07-11 10:33:10
【问题描述】:
我有一个从 Firebase 提取数据的自定义对象的 RecyclerView。在每个项目中,都有一个“likeButton”来增加对某个评论的喜欢。由于 RecyclerViews 没有 onItemClickListener 方法,所以我在适配器类的内部 ViewHolder 类中声明了这一点:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private TextView username, chirp, time, likeCount;
private ImageButton likeButton;
public ViewHolder(View itemView) {
super(itemView);
username = (TextView) itemView.findViewById(R.id.home_feed_item_username);
chirp = (TextView) itemView.findViewById(R.id.home_feed_item_chirp);
time = (TextView) itemView.findViewById(R.id.home_feed_item_time);
likeCount = (TextView) itemView.findViewById(R.id.home_feed_item_like_count);
likeButton = (ImageButton) itemView.findViewById(R.id.home_feed_item_like_button);
//set click listener for likeButton
likeButton.setOnClickListener(this);
//set click listener for whole view, which will take them to the details activity
itemView.setOnClickListener(this);
}
//define click listener for likeButton
@Override
public void onClick(View v) {
if(v.getId() == likeButton.getId()){
//access Firebase
final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("chirps");
//query for this specific chirp
Query query = reference.orderByChild("chirp").equalTo(chirp.getText().toString());
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
//convert the dataSnapshot
HomeFeedItem queryResult = dataSnapshot.getValue(HomeFeedItem.class);
//here, it keeps printing out 0
System.out.println(queryResult.getLikeCount());
//increment it
int likeCountUpdated = queryResult.getLikeCount() + 1;
//update the likeCount textview
likeCount.setText(String.valueOf(likeCountUpdated));
//update the likeCount in the database
for (DataSnapshot child: dataSnapshot.getChildren()) {
reference.child(child.getKey()).child("likeCount").setValue(likeCountUpdated);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Toast.makeText(v.getContext(), "Ahh, you liked "+username.getText().toString()+"'s chirp!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(v.getContext(), "Going to chirp activity...", Toast.LENGTH_SHORT).show();
}
}
}
所以这个想法是,每当用户单击likeButton 时,它都会增加类的likeCount 并更新Firebase。但是,这仅在我第一次单击 likeButton 时有效 - likeCount textView 和 Firebase 都增加了一个,但仅在第一次时,换句话说。在我的 SOUT 语句中,对于后续的点击,它一直说 likeCount 是 0,所以看起来它正在查询 HomeFeedItem 的第一个实例,而不是更新的 Firebase 对象。以及如何让它在我每次单击它时查询更新的 Firebase 对象,而不仅仅是获取原始对象?谢谢!
【问题讨论】:
-
尝试使用 query.addChildEventListener 代替 query.addValueEventListener
标签: android firebase firebase-realtime-database android-recyclerview