如何在Android中的recyclerView中处理多个布局点击

Raf*_*ael 9 android onclicklistener android-recyclerview

在我们的应用程序中,我们有消息列表.我们正在转向RecyclerView.我们的消息可以包括文本,图像.示例消息可能如下所示. 在此输入图像描述

要处理点击,请使用此类:

public class RecyclerViewItemClickListener implement  RecyclerView.OnItemTouchListener {

    public static interface OnItemClickListener {
        public void onItemClick(View view, int position);
        public void onItemLongClick(View view, int position);
    }

    private OnItemClickListener mListener;
    private GestureDetector mGestureDetector;

    public RecyclerViewItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e)
            {
                View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if(childView != null && mListener != null)
                {
                    mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我们在这样的活动中实施此点击:

chatView.setLongClickable(true);
        chatView.addOnItemTouchListener(
                new RecyclerViewItemClickListener(this, chatView, new RecyclerViewItemClickListener.OnItemClickListener() {
                    @Override public void onItemClick(View view, int position) {

                        //handleSingleClick(view, position);

                    }
                    @Override
                    public void onItemLongClick(View view, int position)
                    {
                        handleLongPress(position);
                    }
                })
        );
Run Code Online (Sandbox Code Playgroud)

消息的点击工作正在运行,现在我也希望处理userAvatar同样的点击GestureDetection.是否可以检测单击哪个列表项布局GestureDetector

换句话说,我可以GestureDetecter点击儿童.在我的情况下,点击设置为整个项目(头像,短信,图像).我可以检测此项目中的哪个元素被点击(例如我想要捕捉头像点击).

小智 5

处理 RecyclerView 适配器中的点击,如下例所示:

private class BookmarkViewHolder extends RecyclerView.ViewHolder {

        protected ImageView thumbnailIcon;
        protected TextView postTitle;
        protected TextView postViewCount;

        public BookmarkViewHolder(View v) {
            super(v);

            thumbnailIcon = (ImageView) v.findViewById(R.id.thumbnailIcon);
            postTitle = (TextView) v.findViewById(R.id.postTitleTV);
            postViewCount = (TextView) v.findViewById(R.id.viewCountTV);

            v.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {                                                
                }
            });

            thumbnailIcon.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {                                                
                }
            });

            postTitle.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {                                                
                }
            });


        }
    }
Run Code Online (Sandbox Code Playgroud)


Ahm*_*imi 0

您可以尝试以下代码:

GestureDetector detector;
Run Code Online (Sandbox Code Playgroud)

然后:

detector = new GestureDetector(MainActivity.this, MainActivity.this);

    avatar.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View view, MotionEvent e) {
            detector.onTouchEvent(e);
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)