Програмно прокрутіть до початку NestedScrollView


82

Чи є спосіб програмно прокрутити до початку a NestedScrollView, також запускаючи події прокрутки для батьків? smoothScrollTo(x, y)не делегує події прокрутки до NestedScrollingParent.


Уточнюйте своє запитання ще, ви маєте на увазі сказати, коли NestedScrollView знаходиться всередині макета координатора?
Pier Betos

програмно прокручувати в будь-якій точці, перевірка 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- швидкість у напрямку у.


1
якщо вам подобається лише прокручувати, щоб приховати розкладку програми, як у моєму випадку, ви можете зробити, behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);щоб повернути її назадbehavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
k0sh

3
Дякую. Будь-яка ідея про те, як прокрутити до кінця вкладеного перегляду?
Бібу

Коли AppBarLayout буде розширено, симуляція вкладеного перекидання згорнуть його (що чудово), але не призведе до одночасного прокручування NestedScrollView ...
Рафаель Роєр-Рівард,

Крім того, коли AppBarLayout повністю згорнуто, використання негативного значення y швидкості не розширить його.
Рафаель Ройє-Рівард,

33

Інший спосіб плавного прокручування NestedScrollViewдо кінця вгору або вниз - використання fullScroll(direct)функції

nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);

fullScroll (View.FOCUS_UP) прихована панель програм не виходить. Будь-яка ідея
Shabbir Dhangot

@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
Ву-у-у, це найкраще, Дамет Гарм
аббасалім

11
Якщо у кого-небудь проблема полягає в тому, що перегляд recicler всередині вкладеного подання прокрутки вже прокручується наполовину при введенні активності, спробуйте встановити самий верхній елемент під коренем XML, щоб мати таку властивість android: focusableInTouchMode = "true"
user1025013

1
Це рішення чудово працює там, де як scrollView.scrollTo (0,0); не працює взагалі.
taranjeetsapra

4
Це спрацювало:scrollView.getParent().requestChildFocus(scrollView, scrollView);
Раджеєв Саху

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 (true); - працював у мене! Спасибі :)
Андрій

Дякую! Це найбільш правильна відповідь, особливо при використанні appbarlayout
demogorgorn

11

Ви можете легко підробити прокрутку на рівні NestedScrollView. Ви в основному повідомляєте koordinatorLayout, що ви щойно прокрутили висоту панелі інструментів.

    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. Ви економите мій час
Приянка Г

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.