緣由
RecyclerView item可以實現滑動的監聽,可以允許使用者左滑動右滑動消失,也允許使用者點擊item。 分別需要重載onTouch與onClick方法,但兩者時間會衝突,onClick會消費掉事件,導致事件不會傳遞到onTouch中。解決方案是將onClick的邏輯移動到onTouch中。
判定條件
參考資料1,使用了時間與移動距離兩個變數要確保使用者的確是想要點擊item。滿足這個條件將會調用onClick裡的邏輯,否則滑動邏輯將被調用。時間控制在1s內, 思路是在ACTION_DOWN中記一個按下按鈕的時間,在ACTION_UP判斷是否ACTION_UP到ACTION_DOWN需要的時間小不小於1s;距離是衡量值是從ViewConfiguration這個類中取出來的,是安卓推薦的資料。
具體代碼
private static final int MAX_CLICK_DURATION = 1000;
private int mSlop;
private long pressStartTime;
private float pressedX;
private float pressedY;
...
ViewConfiguration vc = ViewConfiguration.get(builder.mRecyclerView.getContext());
mSlop = vc.getScaledTouchSlop();
...
case MotionEvent.ACTION_DOWN: {
pressStartTime = System.currentTimeMillis();
pressedX = motionEvent.getX();
pressedY = motionEvent.getY();
...
case MotionEvent.ACTION_UP: {
long pressDuration = System.currentTimeMillis() - pressStartTime;
if (pressDuration < MAX_CLICK_DURATION && distance(pressedX, pressedY, motionEvent.getX(), motionEvent.getY()) < mSlop) {
mItemClickCallback.onClick(mRecyclerView.getChildPosition(mDownView));
return true;
}