webentwicklung-frage-antwort-db.com.de

Blättern Sie durch RecyclerView, um das ausgewählte Element oben anzuzeigen

Ich bin auf der Suche nach einer Möglichkeit, ein _RecyclerView zu scrollen, um das ausgewählte Element oben anzuzeigen.

In einem ListView konnte ich das tun, indem ich scrollTo(x,y) benutze und die Spitze des zu zentrierenden Elements erhalte.

So etwas wie:

@Override
public void onItemClick(View v, int pos){
    mylistView.scrollTo(0, v.getTop());
}

Das Problem ist, dass RecyclerView einen Fehler zurückgibt, wenn die scrollTo-Methode verwendet wird 

RecyclerView unterstützt nicht das Scrollen zu einer absoluten Position

Wie kann ich mit RecyclerView scrollen, um das ausgewählte Element oben in der Ansicht zu platzieren?

169
Distwo

Wenn Sie den LinearLayoutManager oder StaggeredGridLayoutManager verwenden, verfügen sie jeweils über eine scrollToPositionWithOffset - Methode, die sowohl die Position als auch den Versatz des Starts des Elements vom Beginn des RecyclerView-Objekts übernimmt. Dies scheint, als würden Sie das erreichen, was Sie benötigen (Wenn Sie den Versatz auf 0 setzen, sollte er nach oben ausgerichtet sein).

Zum Beispiel:

//Scroll item 2 to 20 pixels from the top
linearLayoutManager.scrollToPositionWithOffset(2, 20);
317
Niraj

Wenn Sie nach vertikalem LinearLayout Manager suchen, können Sie mit einer benutzerdefinierten LinearSmoothScroller einen reibungslosen Bildlauf erzielen:

import Android.content.Context;
import Android.graphics.PointF;
import Android.support.v7.widget.LinearLayoutManager;
import Android.support.v7.widget.LinearSmoothScroller;
import Android.support.v7.widget.RecyclerView;

public class SnappingLinearLayoutManager extends LinearLayoutManager {

    public SnappingLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
                                       int position) {
        RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext());
        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }

    private class TopSnappedSmoothScroller extends LinearSmoothScroller {
        public TopSnappedSmoothScroller(Context context) {
            super(context);

        }

        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return SnappingLinearLayoutManager.this
                    .computeScrollVectorForPosition(targetPosition);
        }

        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }
}

verwenden Sie eine Instanz des Layoutmanagers in der Recycling-Ansicht. Wenn Sie dann recyclerView.smoothScrollToPosition(pos); aufrufen, wird ein glatter Bildlauf an der ausgewählten Position zum Anfang der Recycling-Ansicht durchgeführt

76
nizammoidu

// Element scrollen

linearLayoutManager.scrollToPositionWithOffset(pos, 0);
41
HBQ

Sie müssen nur recyclerview.scrollToPosition(position) aufrufen. Das ist gut!

Wenn Sie es im Adapter aufrufen möchten, lassen Sie einfach zu, dass der Adapter die Instanz des Recyclings oder der Aktivität oder des Fragments hat, die Recycles enthält, und implementiert dann die Methode getRecyclerview() darin.

Ich hoffe es kann dir helfen.

18
Zero

gleiches mit dem Drehzahlregler

public class SmoothScrollLinearLayoutManager extends LinearLayoutManager {
private static final float MILLISECONDS_PER_INCH = 110f;
private Context mContext;

public SmoothScrollLinearLayoutManager(Context context,int orientation, boolean reverseLayout) {
    super(context,orientation,reverseLayout);
    mContext = context;
}

@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
                                   int position) {
    RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext()){
        //This controls the direction in which smoothScroll looks for your view
        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return new PointF(0, 1);
        }

        //This returns the milliseconds it takes to scroll one pixel.
        @Override
        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
            return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
        }
    };
    smoothScroller.setTargetPosition(position);
    startSmoothScroll(smoothScroller);
}


private class TopSnappedSmoothScroller extends LinearSmoothScroller {
    public TopSnappedSmoothScroller(Context context) {
        super(context);

    }

    @Override
    public PointF computeScrollVectorForPosition(int targetPosition) {
        return SmoothScrollLinearLayoutManager.this
                .computeScrollVectorForPosition(targetPosition);
    }

    @Override
    protected int getVerticalSnapPreference() {
        return SNAP_TO_START;
    }
}
}
11
user2212515

was ich getan habe, um die Bildlaufposition wiederherzustellen, nachdem der RecyclerView auf die Schaltfläche aktualisiert wurde, klickte:

if (linearLayoutManager != null) {

    index = linearLayoutManager.findFirstVisibleItemPosition();
    View v = linearLayoutManager.getChildAt(0);
    top = (v == null) ? 0 : (v.getTop() - linearLayoutManager.getPaddingTop());
    Log.d("TAG", "visible position " + " " + index);
}

else{
    index = 0;
}

linearLayoutManager = new LinearLayoutManager(getApplicationContext());
linearLayoutManager.scrollToPositionWithOffset(index, top);

abrufen des Versatzes des ersten sichtbaren Elements von oben vor dem Erstellen des linearLayoutManager-Objekts und nach dessen Instantiierung wurde das scrollToPositionWithOffset des LinearLayoutManager-Objekts aufgerufen.

6
tsiro

Probier mal was für mich geil war!

Erstellen Sie eine Variable private static int displayedposition = 0;

Nun zur Position Ihres RecyclerView in Ihrer Aktivität.

myRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                LinearLayoutManager llm = (LinearLayoutManager) myRecyclerView.getLayoutManager();


                displayedposition = llm.findFirstVisibleItemPosition();


            }
        });

Platzieren Sie diese Anweisung an der Stelle, an der die frühere Site in Ihrer Ansicht angezeigt werden soll.

LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager();
        llm.scrollToPositionWithOffset(displayedposition , youList.size());

Nun, das ist es, es hat gut funktioniert.

6
user3740244

blättern Sie an einer bestimmten Position
und das hat mir sehr geholfen . Durch Klicklistener können Sie die Position in Ihrem Adapter ermitteln

layoutmanager.scrollToPosition(int position);
3
Sandeep Singh

In meinem Fall haben meine RecyclerView eine solche Polsterauflage 

<Android.support.v7.widget.RecyclerView
     ...
     Android:paddingTop="100dp"
     Android:clipToPadding="false"
/>

Dann muss ich einen Artikel nach oben scrollen

recyclerViewLinearLayoutManager.scrollToPositionWithOffset(position, -yourRecyclerView.getPaddingTop());
2
Linh

Ich weiß nicht, warum ich nicht die beste Antwort gefunden habe, aber es ist wirklich einfach.

recyclerView.smoothScrollToPosition(position);

Keine Fehler

Erstellt Animationen

1
Lucem
If you want to scroll automatic without show scroll motion then you need to write following code:

**=> mRecyclerView.getLayoutManager().scrollToPosition(position);**

If you want to display scroll motion then you need to add following code.
=>Step 1: You need to declare SmoothScroller.

RecyclerView.SmoothScroller smoothScroller = new
                LinearSmoothScroller(this.getApplicationContext()) {
                    @Override
                    protected int getVerticalSnapPreference() {
                        return LinearSmoothScroller.SNAP_TO_START;
                    }
                };

=>step 2: You need to add this code any event you want to perform scroll to specific position.
=>First you need to set target position to SmoothScroller.

**smoothScroller.setTargetPosition(position);**

=>Then you need to set SmoothScroller to LayoutManager.
                        **mRecyclerView.getLayoutManager().startSmoothScroll(smoothScroller);**
0
Paras Santoki

rufen Sie einfach diese Methode auf:

((LinearLayoutManager)RecyclerView.getLayoutManager()).scrollToPositionWithOffset(yourItemPosition,0);

anstatt:

RecyclerView.scrollToPosition(yourItemPosition);