android - ejemplo - ¿Cómo puedo llenar RecyclerView con GridLayoutManager de derecha a izquierda?
recyclerview android studio ejemplo (5)
A primera vista, GridLayouManager debe llenar filas desde la derecha cuando getLayoutDirection()
le da a ViewCompat.LAYOUT_DIRECTION_RTL
. Normalmente, esta dirección se heredará RecyclerView''s
contenedor RecyclerView''s
.
Pero si esto no funciona como se esperaba, o si necesita GridLayoutManager
a la API 16, o si tiene algún dispositivo con mala implementación de soporte de RTL, simplemente puede extraer el GridLayoutManager
de github y usar un administrador personalizado que sintonice. gusto.
Puede ser suficiente para ampliar el stock GridLayoutManager
y anular layoutChunk() .
Estoy tratando de llenar algunos datos en un RecyclerView
con GridLayoutManager
:
GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
Esto llenará los datos en la cuadrícula de izquierda a derecha . El primer elemento se colocará en la parte superior izquierda, etc.
Pero la aplicación que estoy desarrollando está diseñada para un lenguaje RTL, así que necesito que se llene de derecha a izquierda .
Intenté cambiar el último argumento a true
. Pero solo desplazó el RecyclerView
hacia abajo.
La configuración del atributo layoutDirection
para RecyclerView
no funciona (sin tener en cuenta que mi API mínima es 16 y este atributo se agrega para API17 +):
<android.support.v7.widget.RecyclerView
android:id="@+id/grid"
android:layoutDirection="rtl"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
¿Cómo puedo crear una cuadrícula rellena de derecha a izquierda con RecyclerView
?
Cree una clase que amplíe GridLayoutMAnager
y anule el método isLayoutRTL()
esta manera:
public class RtlGridLayoutManager extends GridLayoutManager {
public RtlGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public RtlGridLayoutManager(Context context, int spanCount) {
super(context, spanCount);
}
public RtlGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
super(context, spanCount, orientation, reverseLayout);
}
@Override
protected boolean isLayoutRTL(){
return true;
}
}
Es muy simple, simplemente llame al método setReverseLayout
como,
GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
layoutManager.setReverseLayout(true);
Hay una mejor manera de hacerlo.
Puedes cambiar programáticamente la dirección de diseño de RecycleView
workHourRecycler = view.findViewById(R.id.market_hours_recycler);
workHourRecycler.setLayoutManager(new GridLayoutManager(getContext(),4));
//Programtically set the direction
workHourRecycler.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
La respuesta de Mohammad es verdadera, pero no es necesario crear una nueva clase. simplemente puede anular el método isLayoutRTL.
GridLayoutManager lm = new GridLayoutManager(this, 2) {
@Override
protected boolean isLayoutRTL() {
return true;
}
};