RecyclerView item内部点击事件、item点击事件冲突

1.recyclerview item内部控件没有点击事件
在recyclerview item内部控件不存在点击事件的情况下。item设置点击事件可通过添加触摸事件

recyclerview.addOnItemTouchListener();//为item添加触摸事件监听

OnItemTouchListener 的相应定义

/**处理类*/
 private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {

        public  boolean onSingleTapUp(MotionEvent event){
            View child = recyclerView.findChildViewUnder(event.getX(), event.getY());
            if (child != null){
                RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);
                onItemClick(viewHolder);
            }
            return true;
        }

        public  void onLongPress(MotionEvent event){
            View child = recyclerView.findChildViewUnder(event.getX(), event.getY());
            if (child != null){
                RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);
                onItemLongClick(viewHolder);
            }
        }



    }
/**通用recyclerView item点击事件实现*/
public abstract MyItemClickListener implments RecylerView.OnItemTouchListener{
    //view
    private final RecyclerView recyclerView;
    //手势识别类
    private final GestureDetectorCompat mGestureDetector;

    public MyItemClickListener(RecyclerView recyclerView){
         this.recyclerView = recyclerView;
        mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchHelperGestureListener());
    }
      @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
    }

      @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
        return false;
    }

     @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }

    //直接将上面的类写作内部类并调用下方的方法。
    public abstract void onItemClick(RecyclerView.ViewHolder viewHolder);

    public abstract void onItemLongClick(RecyclerView.ViewHolder viewHolder);
}
此方法只适用于item 内部控件无监听事件。

2.item 内部控件点击事件
此种情况针对内部item有监听事件

适配器中通过实现点击事件、长按事件来实现item的点击、长按事件。
//监听器 这里方便设置调用点击、长按事件直接写在一个监听类中
public interface MyItemClickListener{
    void onItemClick();
    void onItemLongClick();
}
//适配器
MyItemClickListener listener=null;
onCreateViewHolder() 中设置点击、长按事件。
v.setOnClickListener(this);
v.setOnLongClickListener(this);

onBindViewHolder()方法中
为view设置tag;
holder.itemView.setTag(position);

调用方法设置
public void setOnItemListener(MyItemClickListener listener){
    this.listener=listener;
}

@Override
public void onClick(View v) {
    if(listener!=null){
        listener.onItemClick
    }
}

直接在adapter实例之后进行事件的调用。在相对应的地方try{}catch(Exception e){}

以上为实际编码中遇到的事件传递问题的解决。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值