Программно прокрутите до верхней части NestedScrollView

82

Есть ли способ программной прокрутки к началу NestedScrollView, также вызывая события прокрутки для родителя? smoothScrollTo(x, y)не делегирует события прокрутки объекту NestedScrollingParent.

lukas1994
источник
Уточните свой вопрос, хотите ли вы сказать, когда NestedScrollView находится внутри макета координатора?
Пьер Бетос 08
для программной прокрутки к любой точке проверьте stackoverflow.com/questions/52083678/…
user1506104

Ответы:

106
NestedScrollView.scrollTo(0, 0);
Тихий Рыцарь
источник
7
Я говорю вам использовать NestedScrollView.scrollTo(0, 0);для прокрутки к началу NestedScrollView. Добро пожаловать.
SilentKnight
Это обычно применяется как к ScrollView, так и к NestedScrollView.
Роберт
42

У меня получилось (анимированная прокрутка):

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    behavior.onNestedFling(coordinatorLayout, appBarLayout, null, 0, 10000, true);
}

где 10000- скорость в y-направлении.

lukas1994
источник
1
если вам нравится только прокручивать, чтобы скрыть расположение панели приложений, как в моем случае, вы можете сделать, behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);чтобы отменить егоbehavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
k0sh
3
Спасибо. Любая идея о том, как прокрутить до конца nestedscrollview?
Бибу 08
Когда AppBarLayout расширяется, имитация вложенного броска сворачивает его (что здорово), но не заставляет NestedScrollView одновременно прокручиваться вниз ...
Рафаэль Ройер-Ривард,
Кроме того, когда AppBarLayout полностью свернут, использование отрицательного значения скорости y не приведет к его расширению.
Рафаэль Ройер-Ривард
33

Еще один способ плавной прокрутки NestedScrollViewвверх или вниз - использование fullScroll(direct)функции

nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);
Шардж
источник
fullScroll (View.FOCUS_UP) скрытая панель приложений не выходит. Any Idea
Шабир Дхангот
@Sabbir Dhangot, вы разместили свой NestedScrollViewпод панелью приложений?
MeLine
У меня есть один вопрос, который я вижу, что fullScroll получает представление. если я хочу перейти к определенному текстовому представлению, редактированию или recyclerView, прокрутится ли он до него?
Фелипе Франко,
22

У меня ничего не работало, и я действительно не знаю, почему это сработало, но вот мое решение и проблема.

При добавлении представления ресайклера во вложенное представление прокрутки оно показывало на экране вид ресайклера при переходе к этому действию. Чтобы прокрутить вверх, мне пришлось использовать это:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.details_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(new DefaultItemAnimator());
ProductDescriptionAdapter adapter = new ProductDescriptionAdapter(this);
adapter.setData(mProduct.getDetails());
recyclerView.setAdapter(adapter);
NestedScrollView scrollView = (NestedScrollView) findViewById(R.id.scroll);
scrollView.getParent().requestChildFocus(scrollView, scrollView);
Вулович Вукасин
источник
5
Wooooow, это лучше всего, дамет Гарм
аббасалим 01
11
Если у кого-то проблема заключается в том, что recyclerview внутри вложенного представления прокрутки уже прокручивается наполовину при входе в действие, попробуйте установить для самого верхнего элемента в корневом каталоге XML следующее свойство android: focusableInTouchMode = "true"
user1025013
1
Это решение отлично работает там, где scrollView.scrollTo (0,0); вообще не работает.
taranjeetsapra
4
Это сработало:scrollView.getParent().requestChildFocus(scrollView, scrollView);
Rajeev Sahu
1
Работал как шарм. Спасибо
Vinoth ios
21

Я тоже столкнулся с подобным добрым сценарием. В моем случае, когда я прокручиваю страницу вниз до конца, должна появиться кнопка FAB, и когда пользователь нажимает на эту кнопку FAB, она должна переходить в верхнюю часть страницы. Для этого я добавил ответ @SilentKnight NestedScrollView.scrollTo(0, 0);Для перехода наверх, но этого недостаточно для плавной анимации для прокрутки вверх.
Для плавной анимации я использовал ответ @Sharj, NestedScrollView.fullScroll(View.FOCUS_UP); но тогда мой AppBar не отображается, поэтому я должен расширить AppBar следующим образом appBarLayout1.setExpanded(true). Таким образом, используя эти три, я могу плавно перейти к началу страницы.

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);
Виду
источник
5
appBarLayout1.setExpanded (правда); - у меня сработало! Спасибо :)
Андрей
Спасибо! Это наиболее правильный ответ, особенно при использовании appbarlayout
demogorgorn
11

Вы можете легко имитировать прокрутку на уровне NestedScrollView. Вы в основном говорите координаторуLayout, что вы только что прокручивали по высоте панели инструментов.

    NestedScrollView nestedScrollView = (NestedScrollView) getActivity().findViewById(R.id.your_nested_scroll_view);

    int toolbarHeight = getActivity().findViewById(R.id.toolbar).getHeight();

    nestedScrollView.startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
    nestedScrollView.dispatchNestedPreScroll(0, toolbarHeight, null, null);
    nestedScrollView.dispatchNestedScroll(0, 0, 0, 0, new int[]{0, -toolbarHeight});
    nestedScrollView.scrollTo(0, nestedScrollView.getBottom());
user1259201
источник
Единственный ответ, который сработал для меня! Мне нужно было прокрутить вверх в макете координатора (так что и nestedScrollView, и collapsibleToolbar). Я использовал существующий код, но toolbarHeight изменился на Integer.MIN_VALUE и -toolbarHeight на Integer.MAX_VALUE (поскольку мне нужно противоположное направление). Затем я вызываю appBarLayout.setExpanded (true, true); Спасибо!
Виктория Чеботарь
9

Вы можете использовать это для плавной прокрутки.

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.smoothScrollTo(0,0);

ИЛИ для нормальной прокрутки

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
Али Акрам
источник
Gr8 работа. Вы экономите мое время
Priyanka G
7

Я попробовал все вышеперечисленные ответы, похоже, ничего не сработало, но мне нужен был только postDelayed.

    scrollview.postDelayed(new Runnable() {
        @Override
        public void run() {
            listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
            scrollview.fullScroll(View.FOCUS_DOWN);
        }
    }, 400);
MontDeska
источник
6

Некоторое время так NestedScrollView.scrollTo(0, 0);и scrollview.pageScroll(View.FOCUS_UP);не работает

При этом нужно использовать fling()и smoothScrollTo()вместе

ОБРАЗЕЦ КОДА

nestedScrollView.post {
   nestedScrollView.fling(0)
   nestedScrollView.smoothScrollTo(0, 0)
}
Спросите
источник
2

Добавьте строку два раза. Сработало у меня

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
Салджит Кдж
источник
1

Вместо этого используйте View.scollTo (int x, int y) для прокрутки вверх.

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
Сокдара Ченг
источник
0

У меня была проблема с NestedScrollView, когда я использовал, чем с RecyclerView. Этот код сработал для меня: nestedScrollView !!. GetParent (). RequestChildFocus (nestedScrollView, nestedScrollView);

    val recyclerViewSearch = activity?.findViewById<RecyclerView>(R.id.recycler)
    recyclerViewSearch.setAdapter(setAdapterSearch())

    val nestedScrollView = activity?.findViewById<NestedScrollView>(R.id.bottom_sheet_Search)
    nestedScrollView!!.getParent().requestChildFocus(nestedScrollView, nestedScrollView);
Марьям Аждари
источник
0

Вот как я прокручиваю до элемента RecyclerView, когда RecyclerView находится внутри NestedScrollView

Сначала возьмите, а item heightзатем прокрутите до positionнужного.

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
Абдурахман Попал
источник