嵌套滚动视图布局下用于recyclerview的Scrolltoposition / smoothscrolltoposition

时间:2018-11-26 03:53:48

标签: android android-recyclerview android-nestedscrollview

我在nestsrcollview下有一个recyclerview。我想将滚动实现到recyclerview的特定位置,但遇到了困难。 xml代码是:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".HomeFragment"
    android:background="#ffffff"

    android:fillViewport="true"
    android:id="@+id/nestedscrollview"
    >

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

       <<some other layouts>>

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

            android:layout_marginBottom="52dp"

            />





    </LinearLayout>




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

我想将home_blog_list recyclerview的滚动位置实现到某个位置(例如26)。怎么做? P.S.-我已将home_blog_list的nestedscrollingenabled设置为false。请注意,我想将nestedscrollview滚动到recyclerview的特定行。我不希望只滚动recyclerview的情况。预先感谢!

2 个答案:

答案 0 :(得分:1)

我认为这是您想要的,看看:link

答案 1 :(得分:0)

我偶然发现了一个相同的问题,我发现了一个简单的解决方案,不需要使用asif-ali建议的库进行重构。

在我当前的项目中,我有一个NestedScrollView,其中有一个ConstraintLayoutConstraintLayout包含一个由多个视图组成的复杂标头,然后是我的RecyclerView

与您一样,我需要整个内容都可以滚动。

也就是说,当用户希望查看特定RecyclerView中的商品时,通常会调用:

  

RecyclerView#smoothScrollToPosition(int位置)

但是由于RecyclerView的高度设置为wrap_content,所以将显示完整列表,其中ViewHolder与其adapter中的项目一样多。 当然,我们不能从回收中受益,但是为什么我们需要ScrollView?使用@ asif-ali解决方案肯定会带来回收优化,但这不是重点。

因此,我们有一个布局完整的RecyclerView。为了滚动到特定项目(ViewHolder#itemView)的位置,您可以执行以下操作:

final void smoothScrollToPosition(final int position) {
    final ViewHolder itemViewHolder = this.recyclerView.findViewHolderForAdapterPosition(position);
    // at this point, the ViewHolder should NOT be null ! Or else, position is incorrect !

    final int scrollYTo = (int) itemViewHolder.itemView.getY();
    // FYI: in case of a horizontal scrollview, you may use getX();
    this.nestedScrollView.smoothScrollTo(
        0, // x - for horizontal
        scrollYTo
    );
}

就是这样! 这样做可能会导致孩子不完全可见(在我的测试案例中),所以我建议将itemView的一半高度添加到scrollYTo变量中,以确保nestedScrollView可以滚动足够。如果这样做,您可能还想查看nestedScrollView必须朝哪个方向滚动(向上,然后去除一半高度,或者向下,然后添加一半高度。


[编辑1]

经过进一步测试和研究后,基于以下答案:https://stackoverflow.com/a/6831790/3535408实际上,定位itemView.getBottom更好更好。在我的应用程序上,它可以完美运行。

所以更新后的代码如下:

final void smoothScrollToPosition(final int position) {
    final ViewHolder itemViewHolder = this.recyclerView.findViewHolderForAdapterPosition(position);
    // at this point, the ViewHolder should NOT be null ! Or else, position is incorrect !

    // FYI: in case of a horizontal scrollview, you may use getX();
    this.nestedScrollView.smoothScrollTo(
        0, // x - for horizontal
        itemViewHolder.itemView.getBottom()
    );
}