天天看點

RecyclerView滑動監聽

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    /**
     * Callback method to be invoked when the RecyclerView has been scrolled. This will be
     * called after the scroll has completed.
     * This callback will also be called if visible item range changes after a layout
     * calculation. In that case, dx and dy will be 0.
     * @param recyclerView The RecyclerView which scrolled.
     * @param dx           The amount of horizontal scroll.
     * @param dy           The amount of vertical scroll.
     */
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();//擷取LayoutManager
        //經過測試LinearLayoutManager和GridLayoutManager有以下的方法,這裡隻針對LinearLayoutManager
        if (manager instanceof LinearLayoutManager) {
            //經測試第一個完整的可見的item位置,若為0則是最上方那個;在item超過螢幕高度的時候隻有第一個item出現的時候為0 ,其他時候會是一個負的值
            //此方法常用作判斷是否能下拉重新整理,來解決滑動沖突
            int findFirstCompletelyVisibleItemPosition = ((LinearLayoutManager) manager).findFirstCompletelyVisibleItemPosition();
            //最後一個完整的可見的item位置
            int findLastCompletelyVisibleItemPosition =  ((LinearLayoutManager) manager).findLastCompletelyVisibleItemPosition();
            //第一個可見的位置
            int findFirstVisibleItemPosition =  ((LinearLayoutManager) manager).findFirstVisibleItemPosition();
            //最後一個可見的位置
            int findLastVisibleItemPosition =  ((LinearLayoutManager) manager).findLastVisibleItemPosition();

            //如果有滑動沖突--可以用以下方法解決(如果可見位置是position==0的話才能有下拉重新整理否則禁掉)
            mSwipeRefreshLayout.setEnabled(findFirstCompletelyVisibleItemPosition==0);
            //在網上還看到一種解決滑動沖突的方法
            int topPosition =
                    (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop();

            Log.e("touch", "onScroll:" + topPosition);

            mSwipeRefreshLayout.setEnabled(topPosition >= 0);


       
}
    }
});