1. 程式人生 > >RecyclerView item內部點選事件、item點選事件衝突

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

以上為實際編碼中遇到的事件傳遞問題的解決。