2016-09-18 6 views
0

私は、カードビューのリサイクルビューを持っており、各カードビューにはサムズアップ(like)ボタンがあります。Handling RecyclerView要素内のアイテムをOnClickしますか?

ユーザーが特定のカードの親指ボタンをクリックすると、そのポストが「好き」になり、ボタンがアニメーション化され、適切なロジックが処理されるようにしたいと思います。ここで

は、これまでの私のコードです:

private class CardViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    private CardView mCardView; 
    private TextView cardTitle, cardUsername; 
    private ImageView cardImage; 
    public CardViewHolder(View itemView){ 
     super(itemView); 
     mCardView = (CardView) itemView.findViewById(R.id.cardview); 
     cardTitle = (TextView) itemView.findViewById(R.id.cardTitle); 
     cardUsername = (TextView) itemView.findViewById(R.id.cardUsername); 
     cardImage = (ImageView) itemView.findViewById(R.id.cardImage); 
     mLikeButton = (LikeButton) itemView.findViewById(R.id.thumb); 

     itemView.setOnClickListener(this); 
     mLikeButton.setOnClickListener(this); 

    } 
    @Override 
    public void onClick(View v) { 

     if (v.getId() == mLikeButton.getId()){ 
      Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
      Toast.makeText(v.getContext(), mRecipes[getAdapterPosition()].getRecipename().toString(), Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

ユーザーのようなボタンをクリックすると、それはトーストで正しいアダプタの位置を表示していますが、それが必要のように、それがアニメーション化しないと、私は方法がありませんその上にアニメーションを設定します。通常、ボタンはクリックされるとアニメートされますが、それがrecyclerview内にあるときは動作しません。

私は

(LikeButton) v.setLiked(true); 

を実行しようとしましたが、キャストが動作していないようでした。私はそれについてのメソッドを呼び出すことができるように、recyclerviewの特定の行の特定のボタンのような直接参照を取得できるようにしたいと思います。それは可能ですか?

これは、クリックリスナーをボタンに設定する悪い方法ですか?

+0

onBindViewHolderメソッドのクリックリスナーで設定します。 –

答えて

0

問題はビューIDのチェックにあります。あなたはあなたのソリューションで行きたい場合は、これは道のようになります。

private static class CardViewHolder extends RecyclerView.ViewHolder 
    implements View.OnClickListener { 

private CardView mCardView; 
private TextView cardTitle, cardUsername; 
private ImageView cardImage; 

public CardViewHolder(View itemView) { 
    super(itemView); 

    mCardView = (CardView) itemView.findViewById(R.id.cardview); 
    cardTitle = (TextView) itemView.findViewById(R.id.cardTitle); 
    cardUsername = (TextView) itemView.findViewById(R.id.cardUsername); 
    cardImage = (ImageView) itemView.findViewById(R.id.cardImage); 
    mLikeButton = (LikeButton) itemView.findViewById(R.id.thumb); 

    itemView.setOnClickListener(this); 
    mLikeButton.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    if (v instanceof LikeButton) { 
     // You now this is the LikeButton 
     Toast.makeText(v.getContext(), "ITEM PRESSED = " + 
       String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
     ((LikeButton) v).setLiked(true); 
    } else { 
     // Not a LikeButton 
     Toast.makeText(v.getContext(), "ROW PRESSED = " + 
       String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
     Toast.makeText(v.getContext(), 
       mRecipes[getAdapterPosition()].getRecipename().toString(), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 
} 

我々はここで何ViewLikeButtonであるかどうかを確認することです。もしそうなら、私たちはそれを安全にキャストし、そのメソッドを呼び出すことができます。そうでない場合はitemViewです。 私の意見では、より良い方法は、匿名でOnClickListenerを実装することです。これは、次のようになります。

private static class CardViewHolder extends RecyclerView.ViewHolder 
    implements View.OnClickListener { 

private CardView mCardView; 
private TextView cardTitle, cardUsername; 
private ImageView cardImage; 

public CardViewHolder(View itemView) { 
    super(itemView); 

    mCardView = (CardView) itemView.findViewById(R.id.cardview); 
    cardTitle = (TextView) itemView.findViewById(R.id.cardTitle); 
    cardUsername = (TextView) itemView.findViewById(R.id.cardUsername); 
    cardImage = (ImageView) itemView.findViewById(R.id.cardImage); 
    mLikeButton = (LikeButton) itemView.findViewById(R.id.thumb); 

    itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // You now for sure this is an ItemView. 
      Toast.makeText(v.getContext(), "ROW PRESSED = " + 
        String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT) 
        .show(); 
      Toast.makeText(v.getContext(), 
        mRecipes[getAdapterPosition()].getRecipename().toString(), 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    mLikeButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // You now for sure this is a LikeButton. 
      Toast.makeText(v.getContext(), "ITEM PRESSED = " + 
        String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT) 
        .show(); 
      ((LikeButton) v).setLiked(true); 
     } 
    }); 
} 
} 

ここでは、我々が扱うようにしたい各ViewについてOnClickListenerを持っています。 Viewにはそれ自身がありますので、私たちはいつでもViewがクリックされたことを知り、それに応じて行動することができます。

+0

Brilliant!どうもありがとうございました! – user2805004

関連する問題