2016-09-18 89 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

相关问题