2015-08-18 2 views
6

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?

Antwort

-1

Sie können Code in "onBindViewHolder" -Funktion in Recycler View Holder schreiben. Darin können Sie den View-Tree-Observer der Recycler-Ansicht abrufen und die Breite oder (und) Höhe der Recycler-Elementansicht ändern.

+0

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. –

2

Eine Möglichkeit, um gleiche Breite/Höhe sicherzustellen, besteht darin, eine benutzerdefinierte Ansicht zu verwenden, die die Höhe basierend auf ihrer Breite berechnet, wenn onMeasure() aufgerufen wird. Die nette Sache dabei ist, dass außer der Erstellung der benutzerdefinierten Ansicht, keine Codierung beteiligt ist.

Hier ist eine benutzerdefinierte Ansicht LinearLayout erstreckt:

public class SquareLayout extends LinearLayout { 

    public SquareLayout(Context context) { 
     super(context); 
    } 

    public SquareLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public SquareLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int width, int height) { 
     // note we are applying the width value as the height 
     super.onMeasure(width, width); 
    } 

} 

Hier ist eine veränderte Version des Rasterelement Layout, die über benutzerdefinierte LinearLayout mit:

<com.yourpackage.name.views.SquareLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <ImageView 
     android:id="@+id/profile_picture" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:cropToPadding="false" 
     android:scaleType="centerCrop" /> 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:includeFontPadding="false" 
     android:textColor="@android:color/black" 
     android:text="Theodore"/> 

</com.yourpackage.name.views.SquareLayout> 
Verwandte Themen