Firebaseからデータを取得するカスタムオブジェクトのRecyclerViewがあります。各項目には、あるコメントの好きなものを増やすための「likeButton」があります。 RecyclerViewsは何onItemClickListenerメソッドを持っていないので、私は、アダプタクラスの内部ViewHolderクラスでこれを宣言した:Android Firebaseで更新されたデータを取得しないクエリ
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();
}
}
}
だから、アイデアは、ユーザがいいね!ボタンをクリックするたびに、それはクラスのlikeCountと更新Firebaseをインクリメントということです。しかし、これはlikeButtonを最初にクリックしたときにのみ機能します。likeCount textViewとFirebaseの両方が1つずつ増えますが、言い換えれば初めてです。私のSOUTステートメントでは、その後のクリックのためにlikeCountが0であると言い続けるので、更新されたFirebaseオブジェクトではなく、HomeFeedItemの最初のインスタンスを照会しているように見えます。それをクリックするたびに、元のオブジェクトをフェッチするのではなく、更新されたFirebaseオブジェクトをクエリする方法についてのアイデアはありますか?ありがとう!
がquery.addChildEventListenerを使用しようとする代わりにquery.addValueEventListener –