2016-03-20 26 views
1

Her zaman aynı yükseklikte ancak farklı genişliğe sahip öğelerle RecyclerView oluşturmak istiyorum. Yatay Geri Dönüştürme Görünümü ile oldukça kolaydır, ancak bunu Dikey Geri Dönüşüm Görünümü ile yapmak istiyorum.Farklı genişlikteki RecyclerView

sonuçta aşağıdaki gibi görünmelidir:

___________________________________________ 
|           | 
|[................] [......] [........] | 
|[......................] [..............] | 
|[.....] [.................]    | 
|[......................] [......]   | 
|           | 
------------------------------------------- 

Bunu nasıl başarabiliriz? Ya da belki geri dönüştürücü görünümünden daha iyi bir şey var mı?

cevap

1

Kısa yanıt LayoutManager'dur. Size bir RecyclerView'de istediğiniz düzeni yapmak için birçok seçenek sunar. Tanımladığınız düzen, GridLayoutManager'ın sağladığı özelliklerin bir varyantı gibi görünüyor, belki de oradan başlıyorsunuz. Bu question'da benzer bir soruna bir çözüm görebilirsiniz. Doron Yakovlev-Golani önerdiği yaklaşımı kullanarak

1

, bu sınıfla yaptı:

public class LessonsLayoutManager extends StaggeredGridLayoutManager { 

    private Point mMeasuredDimension = new Point(); 

    public LessonsLayoutManager() { 
     super(2, HORIZONTAL); 
    } 

    @Override 
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, 
          int widthSpec, int heightSpec) { 

     final int widthSize = View.MeasureSpec.getSize(widthSpec) - (getPaddingRight() + getPaddingLeft()); 

     int width = 0; 
     int height = 0; 
     int row = 0; 

     for (int i = 0; i < getItemCount(); i++) { 

      if (!measureScrapChild(recycler, i, 
       View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), 
       View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), 
       mMeasuredDimension)) continue; 

      if (width + mMeasuredDimension.x > widthSize || mMeasuredDimension.x > widthSize) { 
       row++; 
       width = mMeasuredDimension.x; 
      } else { 
       width += mMeasuredDimension.x; 
      } 

      height += mMeasuredDimension.y; 
     } 

     setSpanCount(row); 
     setMeasuredDimension(View.MeasureSpec.getSize(widthSpec), height); 
    } 

    @Override 
    public boolean canScrollHorizontally() { 
     return false; 
    } 

    @Override 
    public boolean canScrollVertically() { 
     return false; 
    } 

    private boolean measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, Point measuredDimension) { 

     View view = null; 
     try { 
      view = recycler.getViewForPosition(position); 
     } catch (Exception ex) { 
      // try - catch is needed since support library version 24 
     } 

     if (view != null) { 

      RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); 

      int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, 
       getPaddingLeft() + getPaddingRight(), p.width); 
      int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, 
       getPaddingTop() + getPaddingBottom(), p.height); 

      view.measure(childWidthSpec, childHeightSpec); 

      measuredDimension.set(
       view.getMeasuredWidth() + p.leftMargin + p.rightMargin, 
       view.getMeasuredHeight() + p.bottomMargin + p.topMargin 
      ); 

      recycler.recycleView(view); 

      return true; 
     } 

     return false; 
    } 

} 

sonuç şuna benzer:

enter image description here