2016-09-18 102 views
0

我有一個cardviews recyclerview,並且每個cardview有一個大拇指(like)按鈕。在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(); 
     } 
    } 
} 

當用戶點擊等按鈕,它會顯示在祝酒正確的適配器的位置,但它並沒有動畫像它應該和我也沒辦法在其上設置動畫。通常,按鈕在單擊時動畫,但當它位於回收站視圖內時,它似乎不起作用。

我試圖做

(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); 
     } 
    }); 
} 
} 

下面我們就針對我們要處理的每個ViewOnClickListener。因爲每個View都有它自己的,所以我們總是知道哪個View已被點擊並且可以相應地採取行動。

+0

太棒了!非常感謝,夥計! – user2805004

相關問題