RecyclerView onScrolled not being fired at all

依然范特西╮ 提交于 2020-01-24 01:09:08

问题


I am planning to create a paginated scroll-to-bottom RecyclerView. But the onScrolled callback isn't being fired at all:

    mBooksRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            Log.i("Dale", "scrolled");
        }
    });

    mBooksRecyclerView.setNestedScrollingEnabled(false);

    if (Utils.hasContent(books)) {
        mBooksRecyclerView.setVisibility(View.VISIBLE);
        BookCardViewAdapter adapter = new BookCardViewAdapter(this, books);

        final GridLayoutManager gridLayoutManager = new GridLayoutManager(BooksActivity.this, 3);
        mBooksRecyclerView.setLayoutManager(gridLayoutManager);
        mBooksRecyclerView.setAdapter(adapter);

        emptyView.setVisibility(View.GONE);
    } else {
        emptyView.setVisibility(View.VISIBLE);
        mBooksRecyclerView.setVisibility(View.GONE);
    }

I also tried removing the RecyclerView from a NestedScrollView and it still doesn't work.

Here is my XML files:

books_content.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical">

    <RelativeLayout
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="@dimen/books_category_height"
        android:background="@color/gfs_blue">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/categories_tab"
            android:layout_width="match_parent"
            android:layout_height="@dimen/books_category_height">

        </android.support.v7.widget.RecyclerView>
    </RelativeLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/sub_categories_tab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/header"
        android:layout_marginTop="20dp">

    </android.support.v7.widget.RecyclerView>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/books_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@id/sub_categories_tab"
        android:scrollbars="vertical" />
</RelativeLayout>

activity_books.gfs:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">


    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:fitsSystemWindows="true"
        tools:context=".activities.GFSBooksActivity">

        <include
            android:id="@+id/appbarlayout"
            layout="@layout/appbarlayout"/>

        <RelativeLayout
            android:id="@+id/empty_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:layout_below="@id/appbarlayout"
            android:background="@color/white"
            android:visibility="gone">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="No content found"
                android:textColor="@color/gray"
                android:textSize="20dp" />
        </RelativeLayout>

        <include
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            layout="@layout/books_content"
            android:layout_below="@+id/appbarlayout"/>
        <!--<android.support.v4.widget.NestedScrollView-->

            <!--android:layout_width="match_parent"-->
            <!--android:layout_height="match_parent"-->
            <!--app:layout_behavior="@string/appbar_scrolling_view_behavior">-->


        <!--</android.support.v4.widget.NestedScrollView>-->

    </RelativeLayout>


    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

Initially, it was under a NestedScrollView but since it was mentioned that onScroll wouldn't be called if the RecyclerView is inside a NestedScrollView or a ScrollView, I removed the NestedScrollView.


回答1:


I restarted my Android Studio and it is now working all along. But the fix probably was removing the RecyclerView inside the NestedScrollView.




回答2:


You have disabled RecyclerView's scrolling. Hence, you will not receive any events of its scroll. You need to instead add the scroll event of parent of recyclerView which should be NestedScrollView not ScrollView.




回答3:


Try this

int pastVisibleItem, visibleItemCount, totalItemCount, currentPage = 1, mPage = 1;
private boolean loading = true;

now use this method to implement pagination

 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);
                //Log.e("checkkk", "cheeckk");

                visibleItemCount = recyclerView.getChildCount();
                totalItemCount = mLayoutManager.getItemCount();
                pastVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
                if (loading) {
                    if ((visibleItemCount + pastVisibleItem) >= totalItemCount) {
                        loading = false;
                        currentPage++;
                        // do your stuff here
                    }
                }
            }
        });


来源:https://stackoverflow.com/questions/50054960/recyclerview-onscrolled-not-being-fired-at-all

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!