Scrolltoposition/ smoothscrolltoposition для просмотра переработчика под вложенным макетом просмотра прокрутки
У меня есть обзор переработчика под nestedsrcollview. Я хочу реализовать прокрутку на определенную позицию для обзора переработчика, но у меня возникли трудности с этим. 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>
Я хочу реализовать scrolltoposition для view-сообщения home_blog_list в позицию (скажем, 26). Как это сделать? PS - Я установил для nestedscrollingenabled значение false для home_blog_list. Обратите внимание, что я хочу прокрутить nestedscrollview в определенную строку в представлении реселлера. Мне не нужен случай, когда прокручивается только просмотрщик. Заранее спасибо!
1 ответ
Я наткнулся на ту же проблему и нашел простое решение, которое не требует рефакторинга с использованием библиотеки, предложенной asif-ali.
В моем текущем проекте у меня есть NestedScrollView
что держит ConstraintLayout
. ЭтаConstraintLayout
содержит сложный заголовок, состоящий из нескольких представлений, а затем мой RecyclerView
.
Как и вам, мне нужно, чтобы все это можно было прокручивать.
Тем не менее, когда пользователь желает увидеть элемент из определенного RecyclerView
, вы обычно звоните:
RecyclerView#smoothScrollToPosition(целое положение)
Но поскольку RecyclerView
высота установлена на wrap_content
отображается полный список с таким количеством ViewHolder
s, так как в его 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 mayuse getX();
this.nestedScrollView.smoothScrollTo(
0, // x - for horizontal
scrollYTo
);
}
Это оно! Возможно, после этого дочерний элемент не полностью виден (в моем тестовом примере), поэтому я бы предложил добавить половину высоты itemView вscrollYTo
переменная, чтобы убедиться, что nestedScrollView
будет достаточно прокрутки. Если вы это сделаете, вы также можете проверить, в каком направленииnestedScrollView
должен прокрутить до (либо вверх, затем убрать половину высоты, либо вниз, затем добавить половину высоты.
[ИЗМЕНИТЬ 1]
После дальнейшего тестирования и исследований, основанных на этом ответе: /questions/27933855/est-li-sposob-programmno-prokrutit-predstavlenie-prokrutki-do-opredelennogo-teksta-redaktirovaniya/27933890#27933890 самом деле лучше и проще настроить таргетинг на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 mayuse getX();
this.nestedScrollView.smoothScrollTo(
0, // x - for horizontal
itemViewHolder.itemView.getBottom()
);
}