Android Recycler视图OnItemTouch只能单击文本视图

时间:2015-06-27 11:56:58

标签: android android-recyclerview

我有RecyclerView我在其中添加了addOnItemTouchListener来处理触摸事件。

代码正在关注,它可以在我点击用于创建RecyclerView的卡片视图的任何位置工作。

      mRecyclerDrawer.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), mRecyclerDrawer, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                mDrawerLayout.closeDrawer(GravityCompat.START);
                ((ActivityMain) getActivity()).onDrawerItemClicked(position - 1);
            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));



 static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

        private GestureDetector gestureDetector;
        private ClickListener clickListener;

        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
            this.clickListener = clickListener;
            gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (child != null && clickListener != null) {
                        clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                    }
                }
            });
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                clickListener.onClick(child, rv.getChildPosition(child));
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        }
    }

但问题是在我的用例中我有一个卡片视图,其中一个TextView中有一些文本,另一个TextView名称读取更多,所以我希望onClick事件只在我调用时调用点击"阅读更多" TextView,而不是CardView上的任何位置。

2 个答案:

答案 0 :(得分:1)

我认为你的方法是最好的。如果您仔细阅读文档,则说明:

  

public void addOnItemTouchListener(RecyclerView.OnItemTouchListener   听者)

     

添加RecyclerView.OnItemTouchListener以拦截触摸事件   在他们被发送到儿童观点或这个观点的标准之前   滚动行为。

     

客户端代码可以使用侦听器来实现项目操作行为。   一旦侦听器从onInterceptTouchEvent(RecyclerView,   MotionEvent)它的onTouchEvent(RecyclerView,MotionEvent)方法会   为每个传入的MotionEvent调用,直到手势结束。

我认为您应该在适配器内为每个项目视图调用View.setOnClickListener

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.mTextView.setOnClickListener(YourOnClickListenerGoesHere);
    holder.mTextView.setText(mData.get(position).toString());
}

答案 1 :(得分:0)

@ mdelolmo的答案是一种更好的方法,而是使用onCreateViewHolder来添加监听器而不是onBind。此外,如果您真的想要使用您的方法,那么当您不希望孩子处理它时,您应该从onInterceptTouch方法返回true。