2016-09-18 9 views
0

У меня есть recycliewiew of cardviews, и у каждого картона есть кнопка с большими пальцами (например).Работа с OnClick на элементе в элементе RecyclerView?

Мне бы хотелось, чтобы пользователь нажал кнопку большого пальца на определенной карте, они «любят» этот пост, анимируют кнопку и обрабатывает соответствующую логику.

Вот мой код до сих пор:

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

Проблема заключается в проверке идентификатора вида. Если вы хотите, чтобы пойти с вашим решением, это будет так:

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

Что мы делаем здесь, чтобы проверить, если View является LikeButton. Если это так, мы можем смело отбросить его и называть наш метод. Если нет, то это 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); 
     } 
    }); 
} 
} 

Здесь мы имеем OnClickListener для каждого View мы хотим обрабатывать. Потому что у каждого View есть свои собственные, мы всегда знаем, к какому View был нажат и может действовать соответствующим образом.

+0

Блестящий! Большое спасибо, приятель! – user2805004