滚动停止时如何获取Recyclerview的项目?

时间:2018-01-17 07:46:21

标签: android android-recyclerview recycler-adapter android-scrollview

我在Scrollview中有一个Recyclerview,我想存储Recyclerview的滚动停止的项目详细信息。

我有一个xml,

<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/White">

<RelativeLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/tile_view_pager"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:visibility="gone"
        android:layout_marginRight="2dp"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/news_feed_recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
       />

</RelativeLayout>

我为recyclerview添加了ScrollListener。但是,由于我使用父Scrollview进行活动,因此不会调用recyclerview的ScrollListener。 我尝试将父卷轴视图更改为NestedScrollView,然后recyclerview立即滚动为一个项目,但我希望滚动是自由的。就像滚动我们的联系人一样。

问题:当我滚动时,父ScrollView滚动,我对我的recyclerview没有任何控制权。因此,一旦滚动停止,很难确定回收者视图的哪个项目可见。

基本上我想在不改变XML的情况下进行编码。

4 个答案:

答案 0 :(得分:1)

  

我想存储滚动停止的Recyclerview的项目详细信息。

滚动停止时,滚动状态转换为空闲状态。但是,空闲状态是滚动之前和之后的状态。因此,您正在寻找在建立状态后转换为空闲状态

这样做:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    boolean scrolled;
    int[] displayedPositions;

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState == RecyclerView.SCROLL_STATE_SETTLING) {
            scrolled = true;
        } else if (newState == RecyclerView.SCROLL_STATE_IDLE && scrolled) {
            scrolled = false;
            int[] into = new int[//number of spans];
            displayedPositions = ((StaggeredGridLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPositions(into)
        }
    }
}

答案 1 :(得分:0)

  private int overallXScrol = 0;

//...
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            overallXScroll = overallXScroll + dx;

            Log.i("check","overall->" + overallXScroll);

        }
    });

答案 2 :(得分:0)

尝试NestedScrollView而不是scrollview,如下所示

 <android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/White">

<RelativeLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/tile_view_pager"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:visibility="gone"
        android:layout_marginRight="2dp"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/news_feed_recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
       />

</RelativeLayout>

答案 3 :(得分:0)

我找到了解决方案。我们需要改变布局。我使用CoordinatorLayout作为父视图。现在我可以使用recyclelerview的onScrollListener了。

<android.support.design.widget.CoordinatorLayout    
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/White">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <android.support.v4.view.ViewPager
                    android:id="@+id/tile_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:layout_marginEnd="2dp"
                    android:visibility="gone"/>              

            </LinearLayout>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/news_feed_recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>