Definisco il mio RecyclerView
come griglia impostandone il layout con GridLayoutManger
che ha un conteggio span di 3 che funzionano già correttamente. Aggiungo anche un decoratore di oggetti alla mia vista del riciclatore che gestirà la spaziatura tra gli elementi della griglia, anche questo funziona bene.Come rendere l'elemento griglia di RecyclerView per avere uguale altezza e larghezza?
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {
private int spanCount;
private int spacing;
private boolean includeEdge;
public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
this.spanCount = spanCount;
this.spacing = spacing;
this.includeEdge = includeEdge;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view); // item position
int column = position % spanCount; // item column
if (includeEdge) {
outRect.left = spacing - column * spacing/spanCount; // spacing - column * ((1f/spanCount) * spacing)
outRect.right = (column + 1) * spacing/spanCount; // (column + 1) * ((1f/spanCount) * spacing)
if (position < spanCount) { // top edge
outRect.top = spacing;
}
outRect.bottom = spacing; // item bottom
} else {
outRect.left = column * spacing/spanCount; // column * ((1f/spanCount) * spacing)
outRect.right = spacing - (column + 1) * spacing/spanCount; // spacing - (column + 1) * ((1f/ spanCount) * spacing)
if (position >= spanCount) {
outRect.top = spacing; // item top
}
}
}
}
mio implementazione per l'aggiunta di decorazione oggetto ai miei Recycler Vista:
mBuddiesGrid = (RecyclerView) findViewById(R.id.buddies_grid);
mLayoutManager = new GridLayoutManager(getApplicationContext(), 3);
mBuddiesGrid.addItemDecoration(new GridSpacingItemDecoration(3, (int) dpToPx(10) , true));
mBuddiesAdapter = new BuddiesGridAdapter(getApplicationContext(), new Buddies());
mBuddiesGrid.setLayoutManager(mLayoutManager);
La mia griglia di layout elemento xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:layout_weight="1"
android:cropToPadding="false"
android:id="@+id/profile_picture"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:text="Theodore"
android:includeFontPadding="false"
android:textColor="@android:color/black"
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Con l'aggiunta di spazi tra voce griglia sarà regolare la larghezza dell'elemento di griglia che può eventualmente causare di non ottenere la dimensione delle proporzioni della vista dell'oggetto. Quello che voglio ottenere è ridimensionare l'altezza della mia griglia uguale alla sua larghezza in modo dinamico. Come posso farlo?
Utilizzando la TreeObserver è l'ultima risorsa e un soluzione hacker, utilizzando un layout personalizzato modificato è molto più pulito. Inoltre, la modifica dei layout in base all'ascolto della struttura del layout potrebbe comportare più passaggi di layout. –