简体   繁体   English

如何处理项目单击侦听器上的RecyclerView及其行内的视图

[英]how to handle both RecyclerView on item click listener for its rows and the views inside it

I have recyclerView which contains some text view and 2 image view. 我有的recyclerView包含一些文本视图和2个图像视图。

I would like to do a task when user clicks on each row and another task when user clicks on each of image views .. but I can only handle one of them at the same time. 当用户点击每个图像视图时,我想在用户点击每一行和另一个任务时执行任务..但我只能同时处理其中一个。

Now if I set recylerview.addOnItemTouchListener I can't handle images views onclicks with setting on clicklistener for them in the adapter because when user clicks on image view the row's click listener will trigger. 现在,如果我设置了recylerview.addOnItemTouchListener我无法在适配器中使用clicklistener设置处理图像视图onclicks,因为当用户单击图像视图时,行的点击监听器将触发。

Below code is my class for handling recycler view items 下面的代码是我的处理回收站视图项目的类

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;

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

    public void onLongItemClick(View view, int position);
}

GestureDetector mGestureDetector;

public RecyclerItemClickListener(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 child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null && mListener != null) {
                mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
            }
        }
    });
}

@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 true;
    }
    return false;
}

@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }

@Override
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}

and this is my holder inside adapter 这是我在适配器内的持有人

public MyViewHolder(View view) {
            super(view);
            tv_word = (TextView) view.findViewById(R.id.tv_word_show);
            tv_english = (TextView) view.findViewById(R.id.tv_english_show);
            tv_translation = (TextView) view.findViewById(R.id.tv_tranlation_show);
            tv_numbershow = (TextView) view.findViewById(R.id.tv_numershow);
            fav = (ImageView) view.findViewById(R.id.iv_fav);
            more = (ImageView) view.findViewById(R.id.iv_more);
            fav.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   Toast.makeText(mContext,"show some text for test",Toast.LENGTH_LONG).show();
                }
            });

I appreciate any help for my problem 我感谢任何帮助我的问题

Create Interface in you adapter class. 在适配器类中创建接口。

 public void setClickListener(ClickListener clickListener) {
            this.clickListener = clickListener;
        }

        public interface ClickListener {
            void ItemClicked(View v, int position);
        }

Declare the object on top like this: 像这样在顶部声明对象:

ClickListener clickListener;

holder.view.setOnclickListener(new OnclickListener( 
 @Override
        public void onClick(View v) {
            if (clickListener != null) {
                clickListener.ItemClicked(v, getAdapterPosition());
            }
        }
);

Implement this interface in class and intialize the clicklistener where you are setting adapter to recyclerview. 在类中实现此接口并初始化clicklistener,您将适配器设置为recyclerview。

 adapter.setClickListener(this);

When you will implement this in class you will get following method: 当你在课堂上实现这个时,你会得到以下方法:

 @Override
    public void ItemClicked(View v, int position) {

    }

Apply switch case from v.getId() you can handle as many click listeners you need to implement. v.getId()应用switch case,您可以处理需要实现的单击侦听器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM