Wie scrolle ich recyclerView programmgesteuert?

Lesezeit: 3 Minuten

Benutzer-Avatar
Ege Kuzubasioglu

Ich habe eine horizontale RecyclerView. Wenn ich die Aktivität zum ersten Mal öffne, möchte ich, dass alle Elemente in RecyclerView nach unten (in diesem Fall nach rechts) und zurück nach oben (nach links) scrollen. Ein bisschen wie eine Animation. Das Scrollverhalten sollte für den Benutzer sichtbar sein.

Ich habe versucht, es so zu machen:

Animation slideRight = AnimationUtils.loadAnimation(this, R.anim.slide_right);
        Animation slideLeft = AnimationUtils.loadAnimation(this, R.anim.slide_left);
        slideRight.setDuration(1000);
        slideLeft.setDuration(1000);
        slideRight.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                recyclerView.startAnimation(slideLeft);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        recyclerView.startAnimation(slideRight);

Animationsfolie links:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <translate
        android:duration="200"
        android:fromXDelta="-100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />

</set>

Animationsfolie rechts:

<translate
    android:duration="200"
    android:fromXDelta="100%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="0%" />

Es funktioniert, aber es verschiebt nur die Recycleransicht als Ganzes, ich möchte nur die Elemente scrollen (schieben). Wie kann ich das machen?

  • mit konstanter Geschwindigkeit? Wenn ja, wenn Sie Hunderte von Artikeln haben, wird es ewig dauern, wenn nicht (konstante Zeit), werden die Artikel für den Bruchteil einer Sekunde angezeigt …

    – Pskink

    19. Februar 2018 um 9:28 Uhr

  • Ich habe nur 10 Artikel, dieser Wert wird sich nicht ändern

    – Ege Kuzubasioglu

    19. Februar 2018 um 9:56 Uhr

  • also verwenden smoothScrollToPosition()

    – Pskink

    19. Februar 2018 um 9:57 Uhr

Benutzer-Avatar
ADM

Sie können verwenden scrollToPosition()

recyclerView.post(new Runnable() {
    @Override
    public void run() {
        recyclerView.scrollToPosition(adapter.getItemCount() - 1);
        // Here adapter.getItemCount()== child count
    }
});

oder smoothScrollToPosition()

recyclerView.post(new Runnable() {
    @Override
    public void run() {
        recyclerView.smoothScrollToPosition(adapter.getItemCount()- 1);
    }
});

Um wieder nach oben zu gelangen, müssen Sie die obige Methode mit dem Index 0 aufrufen. Aber zuerst müssen Sie sicherstellen, dass die RecyclerView wird bis zum letzten gescrollt. Setzen Sie also a ScrollListener An RecyclerView um sicherzustellen, dass das letzte Element sichtbar ist.

  • Ich denke, das OP wollte eine Vitrinenrolle, so als würde man bis zum Ende und wieder zurück scrollen.

    – Abbas

    19. Februar 2018 um 9:20 Uhr

  • Ja, ich denke schon . Thx fürs Clearing. Ich habe es zuerst falsch verstanden.

    – ADM

    19. Februar 2018 um 9:21 Uhr

  • @Abbas genau das, was ich meinte

    – Ege Kuzubasioglu

    19. Februar 2018 um 9:23 Uhr

  • recyclerView.postDelayed(() -> recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount() - 1), 1000); recyclerView.postDelayed(() -> recyclerView.smoothScrollToPosition(0),500); ist eine Option, aber es scrollt zu schnell

    – Ege Kuzubasioglu

    19. Februar 2018 um 10:00 Uhr


  • Übrigens, wenn Sie scrollListener verwenden, können Benutzer nicht nach unten scrollen, jedes Mal, wenn sie das tun, geht es zurück nach oben

    – Ege Kuzubasioglu

    19. Februar 2018 um 10:13 Uhr

Benutze das..

 int top = 0;
 recyclerView.smoothScrollToPosition(top); // for top

 int bottom = recyclerView.getAdapter().getItemCount()-1;
 recyclerView.smoothScrollToPosition(bottom);

Benutzer-Avatar
Nikolaus Asinowitsch

Wenn Sie z. Erweitern Sie Ihren Artikel – verwenden Sie diesen Weg:

in app/build.gradle – einfügen:

 implementation 'com.andkulikov:transitionseverywhere:1.7.4'

Wenn Hadle auf BindViewHolder des Adapters klicken – einfügen:

AutoTransition transitionPort = new AutoTransition();
                transitionPort.setDuration(100);
                transitionPort.addListener(new Transition.TransitionListener() {
                    @Override
                    public void onTransitionStart(@NonNull Transition transition) {
                        recyclerView.setEnabled(false);
                        recyclerView.setClickable(false);
                    }

                    @Override
                    public void onTransitionEnd(@NonNull Transition transition) {
                        recyclerView.post(() -> recyclerView.smoothScrollToPosition(position));
                        recyclerView.setEnabled(true);
                        recyclerView.setClickable(true);
                    }

                    @Override
                    public void onTransitionCancel(@NonNull Transition transition) {
                        recyclerView.setEnabled(true);
                        recyclerView.setClickable(true);
                    }

                    @Override
                    public void onTransitionPause(@NonNull Transition transition) {

                    }

                    @Override
                    public void onTransitionResume(@NonNull Transition transition) {

                    }
                });
                TransitionManager.beginDelayedTransition(recyclerView, transitionPort);

Funktioniert nicht, nachdem Sie andere Dinge ausprobiert haben?

Dieses ausgezeichnete Stück Code hat bei mir funktioniert

private void scrollToBottom(final RecyclerView recyclerView) {
    // scroll to last item to get the view of last item
    final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
    final RecyclerView.Adapter adapter = recyclerView.getAdapter();
    final int lastItemPosition = adapter.getItemCount() - 1;

    layoutManager.scrollToPositionWithOffset(lastItemPosition, 0);
    recyclerView.post(new Runnable() {
        @Override
        public void run() {
            // then scroll to specific offset
            View target = layoutManager.findViewByPosition(lastItemPosition);
            if (target != null) {
                int offset = recyclerView.getMeasuredHeight() - target.getMeasuredHeight();
                layoutManager.scrollToPositionWithOffset(lastItemPosition, offset);
            }
        }
    });
}

Sie können die Zeile ändern, wenn Sie zu einem anderen Listenelement springen möchten und nicht zuletzt

final int lastItemPosition = adapter.getItemCount() - 1;

Quelle

1014090cookie-checkWie scrolle ich recyclerView programmgesteuert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy