首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在适配器中区分视图之间的点击事件?

如何在适配器中区分视图之间的点击事件?
EN

Stack Overflow用户
提问于 2019-07-09 00:10:52
回答 3查看 98关注 0票数 0

我有一个RecyclerView,每个项目都有一个自定义视图。这个自定义视图只包含一个收藏的ImageView。我在我的holder类中设置onclick,如下所示:

代码语言:javascript
复制
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中的一个?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-09 00:46:46

您可以通过计算Viewid属性来找出单击了哪个View.getId(),另请参阅View.getId()

代码语言:javascript
复制
@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
EN

Stack Overflow用户

发布于 2019-07-09 00:38:28

您可以使用类似于下面的内容。在单个接口中使用两个方法定义,并将这两个方法分别设置为View和ImageView的clickListeners。然后在用来设置Adapter的活动中实现这些方法

代码语言:javascript
复制
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);
}

您可以从这个answer中找到更多信息

票数 1
EN

Stack Overflow用户

发布于 2019-07-09 01:36:00

使用Id,您可以识别哪个视图被单击。您可以通过计算视图的id属性来找出单击了哪个视图。您也可以使用简单if条件的开关来管理操作。

代码语言:javascript
复制
@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);
      } 
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56938811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档