with recyclerview horizontal ejemplo cardview android android-recyclerview linearlayoutmanager

android - horizontal - recyclerview gradle



RecyclerView smoothScroll para posicionar en el centro. androide (4)

En caso de que alguien necesite el equivalente de Kotlin de la clase en la respuesta aceptada.

class CenterLayoutManager : LinearLayoutManager { constructor(context: Context) : super(context) constructor(context: Context, orientation: Int, reverseLayout: Boolean) : super(context, orientation, reverseLayout) constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) override fun smoothScrollToPosition(recyclerView: RecyclerView, state: RecyclerView.State, position: Int) { val centerSmoothScroller = CenterSmoothScroller(recyclerView.context) centerSmoothScroller.targetPosition = position startSmoothScroll(centerSmoothScroller) } private class CenterSmoothScroller(context: Context) : LinearSmoothScroller(context) { override fun calculateDtToFit(viewStart: Int, viewEnd: Int, boxStart: Int, boxEnd: Int, snapPreference: Int): Int = (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2) } }

Estoy usando el administrador de diseño horizontal para mi RecyclerView . Necesito hacer RecyclerView de la siguiente manera: cuando haga clic en algún elemento, haga que smoothScrool llegue a esa posición y coloque ese elemento en el centro de RecyclerView (si es posible, por ejemplo, 10 elementos de 20).

Por lo tanto, no tengo ningún problema con smoothScrollToPosition() , pero ¿cómo colocar el elemento que en el centro de RecyclerView ?

¡Gracias!


desde ahora (febrero de 2019), podría usar fácilmente este código en ListView

(ListView)word_list_view.smoothScrollToPositionFromTop(your_item_index, center_position.y);

RecyclerView no verificado, supongo que sería lo mismo.


Mejoras en la respuesta: no es necesario anular LinearLayoutManager

De la respuesta anterior:

public class CenterSmoothScroller extends LinearSmoothScroller { CenterSmoothScroller(Context context) { super(context); } @Override public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) { return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2); } }

Aquí cómo usarlo:

RecyclerView.LayoutManager lm = new GridLayoutManager(...): // or whatever layout manager you need ... RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext()); smoothScroller.setTargetPosition(position); lm.startSmoothScroll(smoothScroller);


Si es posible.

Mediante la implementación del método RecyclerView.SmoothScroller onTargetFound(View, State, Action) .

/** * Called when the target position is laid out. This is the last callback SmoothScroller * will receive and it should update the provided {@link Action} to define the scroll * details towards the target view. * @param targetView The view element which render the target position. * @param state Transient state of RecyclerView * @param action Action instance that you should update to define final scroll action * towards the targetView */ abstract protected void onTargetFound(View targetView, State state, Action action);

Específicamente en LinearLayoutManager con LinearSmoothScroller :

public class CenterLayoutManager extends LinearLayoutManager { public CenterLayoutManager(Context context) { super(context); } public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } public CenterLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext()); smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } private static class CenterSmoothScroller extends LinearSmoothScroller { CenterSmoothScroller(Context context) { super(context); } @Override public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) { return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2); } } }