Как различить событие клика между представлениями в адаптере? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть RecyclerView с настраиваемым видом для каждого элемента.Этот пользовательский вид содержит только избранное ImageView.Я установил onclick в своем классе держателей следующим образом:

class DataViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private OnItemViewClickListener onItemViewClickListener;
    private OnFavoriteImageViewClickListener onFavoriteImageViewClickListener;
    private ImageView favoriteImageView;

    DataViewHolder(View itemView, OnItemViewClickListener onItemViewClickListener,
                    OnFavoriteImageViewClickListener onFavoriteImageViewClickListener) {
        super(itemView);
        this.onItemViewClickListener = onItemViewClickListener;
        itemView.setOnClickListener(this);
        favoriteImageView = itemView.findViewById(R.id.favorite_image_view);
        this.onFavoriteImageViewClickListener = onFavoriteImageViewClickListener;
        favoriteImageView.setOnClickListener(this);
    }

    void bindData(Data data) {
        //Bind data to views
    }

    @Override
    public void onClick(View v) {
        int position = getAdapterPosition();
        Data clickedData = getItem(position);
        onItemViewClickListener.onItemViewClick(clickedData);
        onFavoriteImageViewClickListener.onFavoriteImageViewClick(clickedData);
    }
}

public interface OnItemViewClickListener {
    void onItemViewClick(Data data);
}

public interface OnFavoriteImageViewClickListener {
    void onFavoriteImageViewClick(Data data);
}

Как вы можете видеть, я однажды установил прослушиватель щелчков на весь вид и один раз на вид изображения.Проблема в том, что когда я нажимаю ImageView, запускаются оба события щелчка, одно из которых на всем экране, а второе на ImageView.Горячий, чтобы остановить первый (на весь вид) и остаться только один ImageView?Спасибо!

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Вы можете узнать, на какой View щелкнули, оценив его атрибут id, см. Также View.getId () :

@Override
public void onClick(View view) {
    int position = getAdapterPosition();
    Data clickedData = getItem(position);
    int id = view.getId();
    if (id == R.id.favorite_image_view){
        onFavoriteImageViewClickListener.onFavoriteImageViewClick(clickedData)
    }
    else {   
        onItemViewClickListener.onItemViewClick(clickedData);
    }  
}
1 голос
/ 08 июля 2019

Вы можете использовать что-то вроде ниже.Используйте два определения метода в одном интерфейсе и установите для этих методов значение clickListeners для View и ImageView соответственно.Затем реализуйте эти методы в Упражнении, которое вы используете для установки Адаптера

class DataViewHolder extends RecyclerView.ViewHolder {

    private dataViewClickListener dataViewClickListener;
    private ImageView favoriteImageView;

    DataViewHolder(View itemView, final dataViewClickListener dataViewClickListener) {
        super(itemView);
        this.dataViewClickListener = dataViewClickListener;
        favoriteImageView = itemView.findViewById(R.id.favorite_image_view);
    }

    void bindData(final Data data) {
        // Bind data to views
        // then add the listeners
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dataViewClickListener.onItemViewClick(data);
            }
        });
        favoriteImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dataViewClickListener.onFavoriteImageViewClick(data);
            }
        });
    }
}

public interface dataViewClickListener {
    void onItemViewClick(Data data);
    void onFavoriteImageViewClick(Data data);
}

. Вы можете узнать больше из этого ответа

0 голосов
/ 08 июля 2019

Используя Id, вы можете определить, какой вид нажимается.Вы можете узнать, какой вид был выбран, оценивая его атрибутом id.Вы также можете использовать переключатель простых условий для управления операциями.

@Override public void onClick(View v) {
    Data clickedData = getItem(getAdapterPosition());
    switch(v.getId()){
        case R.id.favorite_image_view:
             onFavoriteImageViewClickListener.onFavoriteImageViewClick(clickedData)
             break;
        // Add more case view id if needed
        default:
             onItemViewClickListener.onItemViewClick(clickedData);
      } 
  }
...