android - la vista de reciclaje no es adecuada para todos los tamaños de pantalla
android-recyclerview android-cardview (2)
Estoy usando reciclerview y gridlayout manager con vistas de tarjeta para cada fila, mi vista de fila (childview) no responde en absoluto.
Quiero mostrar 15 vistas de tarjeta de tal manera que en modo vertical todas mis 15 vistas de niño deberían ser visibles y mi vista de reciclador no debería ser desplazable, mientras que en modo horizontal debería actuar al revés (debería ser desplazable)
He probado muchas almas sugeridas en SO, pero nada parece funcionar.
El comportamiento actual en diferentes tamaños de pantalla es el siguiente
En la captura de pantalla adjunta, la tercera columna, la cuarta y la quinta fila no son visibles
En la pantalla anterior, mi interfaz de usuario se ajusta perfectamente en modo vertical, pero en horizontal no puedo ver todas las vistas de tarjeta.
en la captura de pantalla adjunta arriba, la quinta fila no es visible y en el modo horizontal hay algunos errores de capacidad de respuesta. cardview.xml
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cardview="http://schemas.android.com/apk/res-auto"
android:layout_width="127dp"
android:layout_height="118dp"
android:layout_margin="5dp"
cardview:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/mReminder_Image_Id"
android:layout_width="match_parent"
android:layout_height="90dp"
android:scaleType="fitXY"
android:background="#ffffff"/>
<TextView
android:id="@+id/mReminder_Text_Id"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="#2d2d2d"
android:textSize="13sp"
android:text="Reminder texts"/>
</LinearLayout>
</android.support.v7.widget.CardView>
fragment_reminders.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Fragments.Reminders">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reminders"
android:textSize="20dp"
android:textStyle="bold"
android:textColor="@color/tab_background"
android:layout_gravity="center" />
</android.support.v7.widget.Toolbar>
<android.support.v7.widget.RecyclerView
android:id="@+id/mRecyclerView_id"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
¿Alguien puede guiarme para resolver esto? Gracias .
cree una clase de la siguiente manera:
import android.graphics.Rect;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
public class EqualSpacingItemDecoration extends RecyclerView.ItemDecoration {
private final int spacing;
private int displayMode;
public static final int HORIZONTAL = 0;
public static final int VERTICAL = 1;
public static final int GRID = 2;
public EqualSpacingItemDecoration(int spacing) {
this(spacing, -1);
}
public EqualSpacingItemDecoration(int spacing, int displayMode) {
this.spacing = spacing;
this.displayMode = displayMode;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildViewHolder(view).getAdapterPosition();
int itemCount = state.getItemCount();
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
setSpacingForDirection(outRect, layoutManager, position, itemCount);
}
private void setSpacingForDirection(Rect outRect,
RecyclerView.LayoutManager layoutManager,
int position,
int itemCount) {
// Resolve display mode automatically
if (displayMode == -1) {
displayMode = resolveDisplayMode(layoutManager);
}
switch (displayMode) {
case HORIZONTAL:
outRect.left = spacing;
outRect.right = position == itemCount - 1 ? spacing : 0;
outRect.top = spacing;
outRect.bottom = spacing;
break;
case VERTICAL:
outRect.left = spacing;
outRect.right = spacing;
outRect.top = spacing;
outRect.bottom = position == itemCount - 1 ? spacing : 0;
break;
case GRID:
if (layoutManager instanceof GridLayoutManager) {
GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
int cols = gridLayoutManager.getSpanCount();
int rows = itemCount / cols;
outRect.left = spacing;
outRect.right = position % cols == cols - 1 ? spacing : 0;
outRect.top = spacing;
outRect.bottom = position / cols == rows - 1 ? spacing : 0;
}
break;
}
}
private int resolveDisplayMode(RecyclerView.LayoutManager layoutManager) {
if (layoutManager instanceof GridLayoutManager) return GRID;
if (layoutManager.canScrollHorizontally()) return HORIZONTAL;
return VERTICAL;
}
}
y para usarlo con su vista de reciclador:
1) para vista de cuadrícula:
recyclerView.addItemDecoration(new EqualSpacingItemDecoration(<sizeofpixels>, EqualSpacingItemDecoration.GRID));
2) para vista vertical:
recyclerView.addItemDecoration(new EqualSpacingItemDecoration(<sizeofpixels>, EqualSpacingItemDecoration.VERTICAL));
3) para vista horizontal:
recyclerView.addItemDecoration(new EqualSpacingItemDecoration(<sizeofpixels>, EqualSpacingItemDecoration.HORIZONTAL));
Espero que esto te ayude.
puedes usar esto:
recyclerView.setLayoutManager(new RecyclerView.GridLayoutManager(this, span_count)
Podría tener un archivo
res/values/ints.xml
con elementos
<integer>
, dándole al entero un nombre (atributo de nombre) y un valor (texto del nodo
<integer>
).
También puede tener
res/values-w600dp/ints.xml
o
res/values-land
u otras variaciones del recurso, donde proporciona diferentes valores para usar para diferentes tamaños de pantalla.
Luego, en tiempo de ejecución, llame a
getResources().getInteger()
para recuperar el valor correcto del recurso que se usará para el dispositivo actual y úselo en su constructor GridLayoutManager.
Ahora, usted tiene el control sobre cuántas columnas hay, controlando cuántos tramos se suministran al constructor.
developer.android.com/training/multiscreen/screensizes
Otro enfoque, sugerido por
Chiu-Ki Chan
, es crear una subclase de RecyclerView, en la que proporcione un atributo personalizado para un ancho de columna aproximado deseado.
Luego, en el método
onMeasure()
su subclase, puede calcular el número de tramos que se utilizarán para obtener el ancho de columna deseado.
https://developer.android.com/reference/android/support/v7/widget/RecyclerView#setlayoutmanager