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

时间:2016-09-17 12:22:19

标签: android

我有的recyclerView包含一些文本视图和2个图像视图。

当用户点击每个图片视图时,我想在用户点击每一行和另一个任务时执行任务..但我只能同时处理其中一个。

现在,如果我设置recylerview.addOnItemTouchListener我无法在适配器中设置clicklistener上的图像视图onclicks,因为当用户点击图像视图时,行的点击监听器将会触发。

以下代码是我处理回收商视图项目的类

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){}

这是我在适配器内的持有人

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();
                }
            });

我感谢任何有关我的问题的帮助

1 个答案:

答案 0 :(得分:7)

在适配器类中创建接口。

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

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

将对象声明如下:

ClickListener clickListener;

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

在类中实现此接口并初始化clicklistener,您将适配器设置为recyclerview。

 adapter.setClickListener(this);

当你在课堂上实现这个时,你会得到以下方法:

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

    }

v.getId()应用switch case,您可以处理需要实现的单击侦听器。