RecyclerView給item添加事件致使自己的onTouch事件的down沒法捕捉解決

需求

這幾天在用android作網易雲的歌單效果,大體需求是一個全屏的activity,上面是一個LinearLayout,下面是RecyclerView,而後滑動RecylerView總體移動LinearLayout和RecylerView,當LinearLayout移動到頂端的時候再也不繼續移動,而是滾動RecylerViewjava

誤區

第一想法在RecylerView上添加onTouchEventListener,可是這樣就會有一個問題,當在RecylerView的item上添加事件時,RecylerView將沒法捕獲到TouchDownandroid

解決方案

出現這種情況的緣由主要是子控件的事件處理消費掉了這個事件,不讓其繼續傳播ide

在網上搜尋過各類方法,如在item的根佈局上添加android:descendantFocusability="blocksDescendants",設置點擊控件的cclickable和focusable爲true,都沒法解決,最後的解決方案是不用根佈局的onTouchEventListener,改用addOnItemTouchListener,addOnItemTouchListener能夠在點擊item的時候攔截掉這個點擊事件。佈局

代碼展現

songList.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            private int startY;
            @Override
            public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startY = (int) event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int moveY = (int) event.getRawY();
                        //拿到手指移動距離的大小
                        int move_bigY = moveY - startY;
                        //拿到當前控件未移動的座標
                        int top = contentMain.getTop();
                        top += move_bigY;
                        if (top > 0 || top < limitTop) {
                            return false;
                        }
                        contentMain.layout(contentMain.getLeft(), top, contentMain.getRight(), contentMain.getBottom());
                        startY = moveY;
                        break;
                }
                return false;
            }
複製代碼
相關文章
相關標籤/搜索