1. 程式人生 > >安卓解決SwipeRefreshLayout和RecyclerView結合時,重新整理與下拉衝突的問題

安卓解決SwipeRefreshLayout和RecyclerView結合時,重新整理與下拉衝突的問題

在開發過程中,我們經常會去實現一個列表顯示,並能進行下拉重新整理和上拉載入的功能,如果我們使用的原生控制元件,

SwipeRefreshLayout進行下拉重新整理,RecyclerView進行列表展示的話,會發現在下拉的時候有一個問題。在你下拉的時候,可能就會觸發重新整理的方法,進行重新整理,可是我們想要的只是在滑動到列表頂部的時候再進行重新整理,這個查了百度,好像是自帶的一個bug,他無法準確的監聽到,你的下拉是列表的下拉還是重新整理時的下拉,這個時候,需要我們自己加個判斷,當滑動到頂部時,啟動重新整理,否則的話,禁止到重新整理的功能。下面看程式碼:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        //計算Recyclerview第一個item的位置是否可見
        int topRowVerticalPosition
                = (recyclerView == null || recyclerView.getChildCount() == 0)
                ? 0 : recyclerView.getChildAt(0).getTop();

        //當第一個item不可見時,設定SwipeRefreshLayout不可用
        mSwipeRefreshLayout.setPullRefreshEnable(topRowVerticalPosition >= 0);
    }

});

很簡單的幾句判斷,就可以解決他們之間的衝突了。