Scrollen Sie programmgesteuert zum Anfang einer NestedScrollView


80

Gibt es eine Möglichkeit, programmgesteuert nach oben zu scrollen, NestedScrollViewindem auch die Bildlaufereignisse für das übergeordnete Element ausgelöst werden? smoothScrollTo(x, y)delegiert die Bildlaufereignisse nicht an die NestedScrollingParent.


Klären Sie Ihre Frage genauer. Wollen Sie damit sagen, wann sich NestedScrollView im Koordinatorlayout befindet?
Pier Betos

Antworten:


103
NestedScrollView.scrollTo(0, 0);

7
Ich sage dir, du NestedScrollView.scrollTo(0, 0);sollst damit nach oben scrollen NestedScrollView. Bitte schön.
SilentKnight

Dies gilt allgemeiner für ScrollView oder NestedScrollView.
Robert

42

Ich habe es geschafft (animiertes Scrollen):

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

wo 10000ist die Geschwindigkeit in y-Richtung.


1
Wenn Sie nur scrollen möchten, um das Appbarlayout wie in meinem Fall auszublenden, können Sie es behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);umkehrenbehavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
k0sh

3
Danke. Haben Sie eine Idee, wie Sie zum Ende der verschachtelten Bildlaufansicht scrollen können?
Bibu

Wenn das AppBarLayout erweitert wird, wird es durch die Simulation des verschachtelten Flings zusammengebrochen (was großartig ist), aber das NestedScrollView wird nicht gleichzeitig nach unten gescrollt ...
Raphael Royer-Rivard

Wenn das AppBarLayout vollständig reduziert ist, wird es durch die Verwendung eines negativen y-Geschwindigkeitswerts nicht erweitert.
Raphael Royer-Rivard

33

Eine andere Möglichkeit, den Bildlauf NestedScrollViewnach oben oder unten zu glätten , ist die Verwendung der fullScroll(direct)Funktion

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

Die versteckte App-Leiste fullScroll (View.FOCUS_UP) wird nicht angezeigt. Jede Idee
Shabbir Dhangot

@ Sabbir Dhangot hast du dein Layout NestedScrollViewunterhalb der Appbar erstellt?
MeLine

Ich habe eine Frage, die ich sehen kann, dass fullScroll eine Ansicht erhält. Wenn ich zu einer bestimmten Textansicht, Editext oder RecyclerView scrollen möchte, wird dann zu dieser gescrollt?
Felipe Franco

22

Bei mir hat nichts funktioniert, und ich weiß nicht genau, warum das funktioniert hat, aber hier ist meine Lösung und mein Problem.

Beim Hinzufügen einer Recycler-Ansicht zu einer verschachtelten Bildlaufansicht wurde die Recycler-Ansicht auf dem Bildschirm angezeigt, wenn Sie zu dieser Aktivität gelangen. Um ganz nach oben zu scrollen, musste ich Folgendes verwenden:

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, das ist am besten, damet Garm
abbasalim

11
Wenn jemand das Problem hat, dass die Recycling-Ansicht in der verschachtelten Bildlaufansicht bereits zur Hälfte gescrollt wird, wenn Sie die Aktivität eingeben, versuchen Sie, das oberste Element im XML-Stamm mit der folgenden Eigenschaft android festzulegen: focusableInTouchMode = "true"
user1025013

1
Diese Lösung funktioniert perfekt, wenn als scrollView.scrollTo (0,0); funktioniert überhaupt nicht.
Taranjeetsapra

4
Dies funktionierte:scrollView.getParent().requestChildFocus(scrollView, scrollView);
Rajeev Sahu

1
Lief wie am Schnürchen. Vielen Dank
Vinoth ios

21

Ich sah mich auch einem ähnlichen Szenario gegenüber. In meinem Fall sollte beim Scrollen nach unten bis zum Ende die FAB-Schaltfläche angezeigt werden, und wenn der Benutzer auf diese FAB-Schaltfläche tippt, sollte sie oben auf der Seite angezeigt werden. Dafür habe ich @ SilentKnight Antwort hinzugefügt. NestedScrollView.scrollTo(0, 0);Für nach oben gehen, aber das reicht nicht für eine reibungslose Animation zum Scrollen nach oben.
Für eine reibungslose Animation habe ich die @ Sharj-Antwort verwendet. Dann ist NestedScrollView.fullScroll(View.FOCUS_UP); meine AppBar nicht sichtbar. Daher muss ich die AppBar wie folgt erweitern appBarLayout1.setExpanded(true). Mit diesen drei kann ich also problemlos zum Anfang der Seite gelangen.

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);

5
appBarLayout1.setExpanded (true); - hat für mich gearbeitet! Danke :)
Andrei

Vielen Dank! Dies ist die richtigste Antwort, insbesondere bei Verwendung von appbarlayout
demogorgorn

11

Sie können das Scrollen auf NestedScrollView-Ebene leicht vortäuschen. Grundsätzlich teilen Sie dem Koordinatorlayout mit, dass Sie gerade um die Höhe der Symbolleiste gescrollt haben.

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

Die einzige Antwort, die bei mir funktioniert hat! Ich musste im Koordinator-Layout nach oben scrollen (also sowohl nestedScrollView als auch CollapseibleToolbar). Ich habe vorhandenen Code verwendet, aber toolbarHeight wurde in Integer.MIN_VALUE und -toolbarHeight in Integer.MAX_VALUE geändert (da ich eine entgegengesetzte Richtung benötige). Und dann rufe ich appBarLayout.setExpanded auf (true, true); Vielen Dank!
Viktoriia Chebotar

8

Sie können dies für einen reibungslosen Bildlauf verwenden.

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

ODER für normale Schriftrolle

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

Gr8 Job. Sie sparen meine Zeit
Priyanka G

7

Ich habe alle oben genannten Antworten ausprobiert, nichts schien zu funktionieren, aber ich brauchte nur eine Nachverzögerung.

    scrollview.postDelayed(new Runnable() {
        @Override
        public void run() {
            listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
            scrollview.fullScroll(View.FOCUS_DOWN);
        }
    }, 400);

6

Einige Zeit NestedScrollView.scrollTo(0, 0);und scrollview.pageScroll(View.FOCUS_UP);funktioniert nicht

Dazu müssen Sie fling()und smoothScrollTo()zusammen verwenden

BEISPIELCODE

nestedScrollView.post {
   nestedScrollView.fling(0)
   nestedScrollView.smoothScrollTo(0, 0)
}

2

Fügen Sie die Zeile zweimal hinzu. Hat für mich funktioniert

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

1

Verwenden Sie stattdessen View.scollTo (int x, int y), um nach oben zu scrollen.

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);

0

Ich hatte bei der Verwendung ein Problem mit NestedScrollView als mit RecyclerView. Dieser Code hat bei mir funktioniert : 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

So scrolle ich zu einem Element von RecyclerView, wenn sich RecyclerView in NestedScrollView befindet

Holen Sie sich zuerst eine item heightund scrollen positionSie dann zu der gewünschten.

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.