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

时间:2015-10-14 11:05:51

标签: java android android-recyclerview onitemclicklistener

我已从此 Stack overflow解决方案中实施了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--;
                    }
                }
            }
    ));

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

如何跟踪点击的视图?

4 个答案:

答案 0 :(得分:7)

下面是ViewHolder,其中包含两个文本视图即。 titledescription

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 适配器项

最后使用View.getId()OnViewClickListener实施中检索点击后的视图ID。

答案 1 :(得分:5)

该答案已过时,因为它使用已弃用的RecyclerView.getChildPosition(View) 。尝试将其替换为RecyclerView.getChildAdapterPosition(View)

如果我是你,我会为每个ViewHolder及其想要听的子视图创建监听器。老实说,我似乎没有看到使用你引用的更复杂方法的好处。此外,该方法只会告诉您单击了某个项目,而没有关于该项目的子视图。

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

答案 2 :(得分:1)

设置标签

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

view1.setTag(1);

这会将视图标记设置为1。

然后在onItemClick方法:

@Override
public void onItemClick(View view, int position) {
 if(view.getTag()==1)
 {
 //do something
 }
 else
 {
 //do something else
 }

答案 3 :(得分:0)

尝试将onClickListeners添加到子视图。