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.

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

Antworten:

103
NestedScrollView.scrollTo(0, 0);
SilentKnight
quelle
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.

lukas1994
quelle
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);
Sharj
quelle
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);
Vulovic Vukasin
quelle
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);
Vidu
quelle
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());
user1259201
quelle
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);
Ali Akram
quelle
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);
MontDeska
quelle
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)
}
AskNilesh
quelle
2

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

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
Saljith Kj
quelle
1

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

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
Sokdara Cheng
quelle
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);
Maryam Azhdari
quelle
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)
Abdurahman Popal
quelle