Recyclerview addOnItemTouchListener获取点击行内的哪个子视图

8

我已经实现了从Stack Overflow中获取的Recyclerview onclickListener。这个解决方案适用于recycler项目点击事件。但是我无法确定哪个子视图(例如:ImageView、Button)被单击。

     mAttachmentRecyclerview.addOnItemTouchListener(
            new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    if (view.getId()==R.id.attachmnet_remove) {
                        attachmentsList.remove(position);
                        mAttachmentAdapter.notifyDataSetChanged();
                        attachmentCount--;
                    }
                }
            }
    ));

onItemClick(view,position) 总是返回 -1 作为视图 id

我该如何追踪点击的哪个视图?

4个回答

8
以下是一个包含两个文本视图的ViewHolder,即标题和描述:ViewHolder
public class CustomViewHolder extends RecyclerView.ViewHolder {
    private final OnViewClickListener mListener;
    public final TextView title;
    public final TextView description;

    public interface OnViewClickListener {
        void onViewClick(View v, int adapterPosition);
    }

    public CustomViewHolder(View itemView, OnViewClickListener mListener) {
        super(itemView);
        this.mListener = mListener;
        title = (TextView) itemView.findViewById(R.id.titleTextView);
        description = (TextView) itemView.findViewById(R.id.descriptionTextView);

        title.setOnClickListener(onClickListener);
        description.setOnClickListener(onClickListener);

    }

    private final View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mListener.onViewClick(view, getAdapterPosition());
        }
    };
}

这两个子视图都附有一个OnClickListener,该监听器调用自定义的OnViewClickListener实现,同时传递被点击的View以及接收到点击事件的RecyclerView适配器中的项目位置

最后,在OnViewClickListener实现中使用View.getId()来检索所点击视图的ID。


5

这个答案已经过时了,因为它使用了RecyclerView.getChildPosition(View)这个已经弃用的方法。尝试将其替换为RecyclerView.getChildAdapterPosition(View)

如果我是你,我会为每个要监听的ViewHolder及其子视图创建监听器。老实说,我不认为使用你提到的更复杂的方法有什么好处。此外,那个方法只会告诉你一个项目被点击了,没有任何关于项目子视图的信息。

此外,根据文档RecyclerView.OnItemTouchListener旨在在列表滚动时检测触摸项,而不是用于常规或直接触摸。


完全同意您对为每个ViewHolder创建监听器的评论。 - Simon

1

设置标签

您可以在初始化视图时通过以下方式为其设置标签:

view1.setTag(1);

这将把视图标签设置为1。
然后在onItemClick方法中:
@Override
public void onItemClick(View view, int position) {
 if(view.getTag()==1)
 {
 //do something
 }
 else
 {
 //do something else
 }

0
尝试为子视图添加onClickListeners。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接