java - programacion - recyclerview get item position
Elemento de centrado de Android en RecyclerView (5)
Acaba de agregar android:orientation="vertical"
a la raíz de la vista del elemento. Vamos a intentarlo.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="180dp"
android:orientation="vertical"
android:padding="4dp">
<ImageView
android:id="@+id/movie_column_photo"
android:layout_width="80dp"
android:layout_height="120dp"
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/movie_column_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
</LinearLayout>
Soy un novato en Android. No estoy seguro de por qué no puedo centrar mi artículo en RecyclerView.
Lo que quiero es como abajo la imagen: -
Como es la imagen de abajo de Android: -
¿Hay una manera de empujar elementos en RecyclerView para centrar? Así se verá así: -
También proporciono los archivos de diseño a continuación:
recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:id="@+id/calendar_itemContainer">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="April"
android:id="@+id/calendar_txtMonth"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:textColor="#ff58636d"
android:textSize="16sp"
android:gravity="center|center_vertical|center_horizontal"
android:paddingTop="8dp"
android:paddingLeft="12dp"
android:paddingRight="12dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="21"
android:id="@+id/calendar_txtDay"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/calendar_txtMonth"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:textColor="#ff58636d"
android:textSize="40sp"
android:layout_marginTop="-10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingBottom="5dp"
android:gravity="center|center_vertical|center_horizontal" />
</RelativeLayout>
fragment_calendar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/calendar_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="horizontal"
android:background="#ff2c3e50" />
</RelativeLayout>
y los códigos java: -
CalendarAdapter mAdapter = new CalendarAdapter(mDataset);
mLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter.setCalendarCallbacks(this);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
selectItem(mCurrentSelectedPosition);
Estaba tratando de hacer lo que creo que es lo mismo que preguntas cuando me topé con esta publicación. Aquí está la solución que terminé usando.
Cree su propia subclase de LinearLayoutManager y anule getPaddingLeft () y getPaddingRight () de esta forma.
public class CustomLayoutManager extends LinearLayoutManager {
private int mParentWidth;
private int mItemWidth;
public CustomLayoutManager(Context context, int parentWidth, int itemWidth) {
super(context);
mParentWidth = parentWidth;
mItemWidth = itemWidth;
}
@Override
public int getPaddingLeft() {
return Math.round(mParentWidth / 2f - mItemWidth / 2f);
}
@Override
public int getPaddingRight() {
return getPaddingLeft();
}
}
parentWidth
debe ser el ancho de RecyclerView
y itemWidth
debe ser el ancho de cada una de sus vistas secundarias, ambas en píxeles. Obviamente, esto solo funciona si sabes que todas las vistas de tus hijos tendrán el mismo ancho.
Luego, simplemente use este administrador de diseño con su RecyclerView
La respuesta de @majormajors estuvo cerca, pero comenzará centrando el primer elemento en la lista y no centrará los elementos (como un todo) como se muestra en las imágenes. Se debe realizar un cálculo adicional para verificar el ancho total del artículo. He modificado el código publicado por @majormajors.
public class CenterItemLayoutManager extends LinearLayoutManager {
private final int parentWidth;
private final int itemWidth;
private final int numItems;
public CenterItemLayoutManager(
final Context context,
final int orientation,
final int parentWidth,
final int itemWidth,
final int numItems) {
super(context, orientation, false);
this.parentWidth = parentWidth;
this.itemWidth = itemWidth;
this.numItems = numItems;
}
@Override
public int getPaddingLeft() {
final int totalItemWidth = itemWidth * numItems;
if (totalItemWidth >= parentWidth) {
return super.getPaddingLeft(); // do nothing
} else {
return Math.round(parentWidth / 2f - totalItemWidth / 2f);
}
}
@Override
public int getPaddingRight() {
return getPaddingLeft();
}
}
En este caso, los elementos se centrarán solo si no superan el ancho de recyclerview ... de lo contrario, actuará como lo haría normalmente.
Tan fácil como circular con la nueva clase agregada al soporte library- android.support.v7.widget.LinearSnapHelper
Simplemente cree una instancia y adjúntela a recyclerView como se muestra a continuación:
LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
establecer recyclerview a:
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
arreglado para mí