0

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オブジェクトをクエリする方法についてのアイデアはありますか?ありがとう!

+1

がquery.addChildEventListenerを使用しようとする代わりにquery.addValueEventListener –

答えて

0

Firebaseデータベースに対してクエリを実行すると、複数の結果が存在する可能性があります。したがって、スナップショットにはそれらの結果のリストが含まれています。結果が1つだけの場合でも、スナップショットには1つの結果のリストが含まれます。

だからあなたのコードは、スナップショットの子供をループによって、そのリストを処理する必要がある:

Query query = reference.orderByChild("chirp").equalTo(chirp.getText().toString()); 
query.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { 
      //convert the dataSnapshot 
      HomeFeedItem queryResult = childSnapshot.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)); 
     } 
    } 
    ... 
+0

は(私がchildSnapshot.getChildrenをループしていたが判明)を使用し、HomeFeedItemに変換する代わりに 'if(chirpField.getKey()。equals(" likeCount ")){'を使用します。しかし、正しい方向のポイントに感謝します!副次的な話として、あなたは、GoogleとUdacityのウィークエンドビデオのFirebaseの人ですか? –

+0

Aha。私はコードの深いところで何が起こっているのか本当に確かではありませんでしたが、最も外側のループが欠けていたことは間違いありませんでした。それがソートされていると聞いてよかったです。そしてはい:私はそのビデオのバーベキューの男性の一人でした。 :-) –

関連する問題