我在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的情况。预先感谢!
答案 0 :(得分:1)
我认为这是您想要的,看看:link
答案 1 :(得分:0)
我偶然发现了一个相同的问题,我发现了一个简单的解决方案,不需要使用asif-ali建议的库进行重构。
在我当前的项目中,我有一个NestedScrollView
,其中有一个ConstraintLayout
。
ConstraintLayout
包含一个由多个视图组成的复杂标头,然后是我的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
必须朝哪个方向滚动(向上,然后去除一半高度,或者向下,然后添加一半高度。
经过进一步测试和研究后,基于以下答案: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()
);
}