Recyclerview addOnItemTouchListener获取在行内单击的子视图

Alg*_*der 8 java android onitemclicklistener android-recyclerview

我已经从这个Stack溢出解决方案中实现了Recyclerview onclickListener .此解决方案适用于回收商项目点击.但我无法从行中单击哪个子视图(例如: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--;
                    }
                }
            }
    ));
Run Code Online (Sandbox Code Playgroud)

onItemClick(view,position)始终将视图ID返回为-1

如何跟踪点击的视图?

Vai*_*air 7

下面是一个ViewHolder包含两个文本视图即.title并且description:

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());
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这两个子视图都OnClickListener附加了它们,它们调用自定义OnViewClickListener实现,传递View被单击的内容以及接收click事件的适配器项目位置 .RecyclerView

最后用于View.getId()OnViewClickListener实现中检索单击视图的id .


Ari*_*Ari 5

该答案已过时,因为它使用的RecyclerView.getChildPosition(View)不推荐使用的.尝试替换它RecyclerView.getChildAdapterPosition(View).

如果我是你,我会为ViewHolder你想要听的每个及其子视图创建监听器.老实说,我似乎没有看到使用您引用的更复杂方法的好处.此外,该方法只会告诉您项目被点击,项目的子视图没有任何内容.

此外,根据文档,RecyclerView.OnItemTouchListener当您想要在列表滚动时检测项目的触摸时使用,而不是用于常规或直接触摸.