Программно прокрутите до верхней части 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.