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

来源:互联网 发布:加盟淘宝孕婴店 编辑:程序博客网 时间:2024/06/06 18:40

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;}@Overridepublic void onClick(View v) {    if(listener!=null){        listener.onItemClick    }}直接在adapter实例之后进行事件的调用。在相对应的地方try{}catch(Exception e){}

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

原创粉丝点击