12

Ich verwende RecyclerView mit StaggeredGridLayoutManager, um eine zweispaltige Liste zu erstellen. Aber wie man einen rechten Rand zwischen der linken Spalte und der rechten Spalte einstellt. Ich habe diesen Code verwendet, um den rechten Rand von oben zu machen, aber wie man den doppelten Abstand zwischen den Spalten löst.Wie vermeidet man doppelten Abstand zwischen den Elementen, wenn RecyclerView mit StaggeredGridLayoutManager verwendet wird?

public class SpacesItemDecoration extends RecyclerView.ItemDecoration { 
    private int space; 

    public SpacesItemDecoration(int space) { 
     this.space = space; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     outRect.left = space; 
     outRect.right = space; 
     outRect.bottom = space; 

     // Add top margin only for the first or second item to avoid double space between items 
     // Add top margin only for the first or second item to avoid double space between items 
     if((parent.getChildCount() > 0 && parent.getChildPosition(view) == 0) 
      || (parent.getChildCount() > 1 && parent.getChildPosition(view) == 1)) 
     outRect.top = space; 
} 

Und Aktivität:

recyclerView.addItemDecoration(new SpacesItemDecoration(20)); 

Ich habe versucht view.getX() zu verwenden, bringen Sie es immer 0.

mir jemand helfen? Danke vielmals!

Antwort

3

Ich löste es selbst, indem ich Artikelrand und RecyclerView Padding setzte. Sowohl Rand als auch Padding sind die Hälfte des erwarteten Speicherplatzes, so dass das Problem verschwunden ist.

6

Der folgende Code behandelt StaggeredGridLayoutManager, GridLayoutManager und LinearLayoutManager.

public class SpacesItemDecoration extends RecyclerView.ItemDecoration { 

    private int halfSpace; 

    public SpacesItemDecoration(int space) { 
     this.halfSpace = space/2; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 

     if (parent.getPaddingLeft() != halfSpace) { 
      parent.setPadding(halfSpace, halfSpace, halfSpace, halfSpace); 
      parent.setClipToPadding(false); 
     } 

     outRect.top = halfSpace; 
     outRect.bottom = halfSpace; 
     outRect.left = halfSpace; 
     outRect.right = halfSpace; 
    } 
} 
7

In Ihrem Fall können Sie die beiden Marge auf den RecyclerView .Aber in meinem Fall Einstellung ist ein Bild in der RecyclerView die Bildschirmbreite entspricht, und ich verwende das ItemDecoration das Problem zu lösen.

class ViewItemDecoration extends RecyclerView.ItemDecoration { 

    public ViewItemDecoration() { 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, final View view, final RecyclerView parent, RecyclerView.State state) { 
     super.getItemOffsets(outRect, view, parent, state); 
     int position = parent.getChildAdapterPosition(view); 
     int spanIndex = ((StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams()).getSpanIndex(); 
     int type = adapter.getItemViewType(position); 
     switch(type){ 
      case YOUR_ITEMS: 
       if (spanIndex == 0) { 
        outRect.left = 10; 
        outRect.right = 5; 
       } else {//if you just have 2 span . Or you can use (staggeredGridLayoutManager.getSpanCount()-1) as last span 
        outRect.left = 5; 
        outRect.right = 10; 
       } 
     } 
    } 

} 
0

würde ich etwas ändern und

public class SpacesItemDecoration extends RecyclerView.ItemDecoration { 
    private final int mSpace; 

    public SpacesItemDecoration(int space) { 
     this.mSpace = space; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, final View view, final RecyclerView parent, RecyclerView.State state) { 
     super.getItemOffsets(outRect, view, parent, state); 
     int position = parent.getChildAdapterPosition(view); 
     int spanIndex = ((StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams()).getSpanIndex(); 
     if (spanIndex == 0) { 
      outRect.left = 30; 
      outRect.right = 15; 
     } else {//if you just have 2 span . Or you can use (staggeredGridLayoutManager.getSpanCount()-1) as last span 
      outRect.left = 15; 
      outRect.right = 30; 
     } 
     outRect.bottom = 30; 
     // Add top margin only for the first item to avoid double space between items 
     if (parent.getChildAdapterPosition(view) == 0) { 
      outRect.top = 30; 
      outRect.right = 30; 
     } 
    } 
} 
0

Set different links/rechts Platz in ItemDecoration für eine relative Frage nach spanindex nur beide der Antwort ändern funktioniert gut für die Positionssicht hat eine feste Größe. Wenn die Elementansicht die Bildansicht enthält, legen Sie wrap_content in der Höhe fest. In der Elementansicht kann die Span-Position geändert werden, aber der Spannenindex wird nicht wie gewünscht aktualisiert. Der Rand wird unscharf.

Mein Weg ist, mit der symmetrischen links/rechts Platz für Ansicht Element.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // init 
    recyclerView = (RecyclerView) rv.findViewById(R.id.img_waterfall); 
    layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setAdapter(new MyAdapter(getContext())); 
    recyclerView.addItemDecoration(new SpacesItemDecoration(
     getResources().getDimensionPixelSize(R.dimen.space))); 
} 


private static class SpacesItemDecoration extends RecyclerView.ItemDecoration { 
    private final int space; 
    public SpacesItemDecoration(int space) { 
     this.space = space; 
    } 
    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, 
           RecyclerView.State state) { 
     outRect.bottom = 2 * space; 
     int pos = parent.getChildAdapterPosition(view); 
     outRect.left = space; 
     outRect.right = space; 
     if (pos < 2) 
      outRect.top = 2 * space; 
    } 
} 

setzten dann die gleiche Polsterung für RecylerView (links/rechts) android: paddingLeft = "@ Dimen/space" android: paddingRight = "@ Dimen/space"

<android.support.v7.widget.RecyclerView 
     android:id="@+id/img_waterfall" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingLeft="@dimen/space" 
     android:paddingRight="@dimen/space"/> 
0
public class EqualGapItemDecoration extends RecyclerView.ItemDecoration { 

    private int spanCount; 
    private int spacing; 

    public EqualGapItemDecoration(int spanCount, int spacing) { 
     this.spanCount = spanCount; 
     this.spacing = spacing; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 

     StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams(); 

     if (layoutParams.isFullSpan()) { 
      outRect.set(0, 0, 0, 0); 
     } else { 
      int spanIndex = layoutParams.getSpanIndex(); 
      int layoutPosition = layoutParams.getViewLayoutPosition(); 
      int itemCount = parent.getAdapter().getItemCount(); 

      boolean leftEdge = spanIndex == 0; 
      boolean rightEdge = spanIndex == (spanCount - 1); 

      boolean topEdge = spanIndex < spanCount; 
      boolean bottomEdge = layoutPosition >= (itemCount - spanCount); 

      int halfSpacing = spacing/2; 

      outRect.set(
        leftEdge ? spacing : halfSpacing, 
        topEdge ? spacing : halfSpacing, 
        rightEdge ? spacing : halfSpacing, 
        bottomEdge ? spacing : 0 
      ); 
     } 
    } 
} 
Verwandte Themen