Scrolling SwipeRefreshLayout with RecyclerView Update anywhere Android 2.2

I have a problem with my layout, I created a SwipeRefreshLayout using the RecyclerView inside. in android 4.2.2+ everything works fine, but in andorid 2.3.4 I can’t scroll, because it will be updated anywhere in RecyclerView and I have to scroll down and then scroll up.

This is my code:

<android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/forum_swipe_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/LVP"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center" />
</android.support.v4.widget.SwipeRefreshLayout>

I found this problem: https://code.google.com/p/android/issues/detail?id=78191 but there is no solution. Any idea how to fix this?

+4
source share
5 answers

override RecyclerView method OnScrollStateChanged

 mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                // TODO Auto-generated method stub
                //super.onScrollStateChanged(recyclerView, newState);
               try {
                   int firstPos = mLayoutManager.findFirstCompletelyVisibleItemPosition();
                   if (firstPos > 0) {
                       mSwipeRefreshLayout.setEnabled(false);
                   } else {
                       mSwipeRefreshLayout.setEnabled(true);
                       if(mRecyclerView.getScrollState() == 1)
                           if(mSwipeRefreshLayout.isRefreshing())
                            mRecyclerView.stopScroll();
                   }

               }catch(Exception e) {
                   Log.e(TAG, "Scroll Error : "+e.getLocalizedMessage());
               }
            }

, Swipe Refresh , , , , mRecyclerView.stopScroll();

+6

, ​​ .

https://code.google.com/p/android/issues/detail?id=78191

, , canChildScrollUp SwipeRefreshLayout.java recyclerView.canScrollVertically(mTarget, -1). gingerbread canScrollVertically, recyclerview.

, LinearLayoutManager, findFirstCompletelyVisibleItemPosition.

.

+5

, :

private RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        LinearLayoutManager manager = ((LinearLayoutManager)recyclerView.getLayoutManager());
        boolean enabled =manager.findFirstCompletelyVisibleItemPosition() == 0;
        pullToRefreshLayout.setEnabled(enabled);
    }
};

setOnScrollListener addOnScrollListener , .

+4

/ recyclerview

    public class RecyclerSwipeRefreshHelper extends RecyclerView.OnScrollListener{

    private static final int DIRECTION_UP = -1;


    private final SwipeRefreshLayout refreshLayout;

    public RecyclerSwipeRefreshHelper(
            SwipeRefreshLayout refreshLayout) {
        this.refreshLayout = refreshLayout;
    }


    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
       refreshLayout.setEnabled((recyclerView.canScrollVertically(DIRECTION_UP)));
    }
}
+3
source

You can override the canChildScrollUp () method in SwipeRefreshLayout as follows:

public boolean canChildScrollUp() {
    if (mTarget instanceof RecyclerView) {
        final RecyclerView recyclerView = (RecyclerView) mTarget;
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof LinearLayoutManager) {
            int position = ((LinearLayoutManager) layoutManager).findFirstCompletelyVisibleItemPosition();
            return position != 0;
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            int[] positions = ((StaggeredGridLayoutManager) layoutManager).findFirstCompletelyVisibleItemPositions(null);
            for (int i = 0; i < positions.length; i++) {
                if (positions[i] == 0) {
                    return false;
                }
            }
        }
        return true;
    } else if (android.os.Build.VERSION.SDK_INT < 14) {
        if (mTarget instanceof AbsListView) {
            final AbsListView absListView = (AbsListView) mTarget;
            return absListView.getChildCount() > 0
                    && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
                            .getTop() < absListView.getPaddingTop());
        } else {
            return mTarget.getScrollY() > 0;
        }
    } else {
        return ViewCompat.canScrollVertically(mTarget, -1);
    }
}
+1
source

Source: https://habr.com/ru/post/1568916/


All Articles