Ich definiere meine RecyclerView
als Gitter, indem Sie ihr Layout mit GridLayoutManger
, die eine Spannweite von 3 hat, die bereits gut funktionieren. Ich füge meiner Recycler-Ansicht auch einen Objektdekorator hinzu, der den Abstand zwischen den Rasterelementen verwaltet. Dies funktioniert auch gut.Wie wird RecyclerViews Rasterelement auf die gleiche Höhe und Breite gebracht?
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
}
}
}
}
Meine Implementierung für das Hinzufügen von Artikel Dekoration meines Recycler Ausblick:
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);
xml Mein Rasterelement Layout:
<?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>
durch Leerzeichen zwischen dem Rasterpunkt wird das Hinzufügen des Rasterelementes Breite anpassen was möglicherweise dazu führen kann, dass ich die Proportionsgröße meiner Artikelansicht nicht erhalte. Was ich erreichen möchte, ist, die Größe meines Rasterelements dynamisch an seine Breite anzupassen. Wie kann ich es tun?
die TreeObserver Mit einem letzten Ausweg und ein sehr Hackish Lösung, mit einem modifizierten benutzerdefinierten Layout ist viel sauberer. Auch das Ändern der Layouts basierend auf dem Abhören der Layout-Struktur kann zu mehreren Layout-Pässen führen. –