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?
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);
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
// Element scrollen
linearLayoutManager.scrollToPositionWithOffset(pos, 0);
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.
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;
}
}
}
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.
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.
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);
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());
Ich weiß nicht, warum ich nicht die beste Antwort gefunden habe, aber es ist wirklich einfach.
recyclerView.smoothScrollToPosition(position);
Keine Fehler
Erstellt Animationen
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);**
rufen Sie einfach diese Methode auf:
((LinearLayoutManager)RecyclerView.getLayoutManager()).scrollToPositionWithOffset(yourItemPosition,0);
anstatt:
RecyclerView.scrollToPosition(yourItemPosition);