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


82

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


Уточните свой вопрос, хотите ли вы сказать, когда 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-направлении.


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());

Единственный ответ, который сработал для меня! Мне нужно было прокрутить вверх в макете координатора (так что и 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);

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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.