Wie vermeiden Sie doppelte Leerzeichen zwischen Elementen bei der Verwendung von RecyclerView mit StaggeredGridLayoutManager?

Ich benutze RecyclerView mit StaggeredGridLayoutManager, um eine zweispaltige Liste zu erstellen. Aber wie man einen rechten Rand zwischen linker Spalte und rechter Spalte setzt. Ich habe diesen Code benutzt, um den rechten Rand von oben zu machen, aber wie man doppelten Raum zwischen Spalten löst.

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 in der Tätigkeit:

  • Verwenden einer benutzerdefinierten Schrift in Android
  • Hinzufügen von Bildschirmhelligkeitsregeln zu Android-Anwendung
  • Haben Fragmente wirklich einen leeren Konstruktor?
  • Generiere einen Keystore für eine Android App im Assistenten zum Exportieren von Android-Anwendungen?
  • Wie baue ich Produkt-Aromen von Android Studio?
  • "Exportierte Aktivität erfordert keine Berechtigung" beim Versuch, von einem URI zu starten
  •  recyclerView.addItemDecoration(new SpacesItemDecoration(20)); 

    Ich habe versucht, view.getX() , es kommt immer wieder 0.

    Kann mir jemand helfen? Danke vielmals!

  • In Android, wie man EditText der festen Breite zu erstellen?
  • In libgdx, wie bekomme ich die Eingabe von der Back-Taste?
  • Arten von Animationstechniken in Android?
  • Wie benutzt man ActionBarActivity mit Theme.Material
  • Android Studio Gradle: Fehler: Execution fehlgeschlagen für Task ': app: processDebugGoogleServices'. > Kein passender Client gefunden für Paket
  • Android: Hintergrund Bildgröße (in Pixel), die alle Geräte unterstützen
  • 6 Solutions collect form web for “Wie vermeiden Sie doppelte Leerzeichen zwischen Elementen bei der Verwendung von RecyclerView mit StaggeredGridLayoutManager?”

    In deinem Fall kannst du den beiden Rand auf die RecyclerView einstellen. Aber in meinem Fall ist ein Bild mit der Bildschirmbreite im RecyclerView übereinstimmend und ich verwende die ItemDecoration, um 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; } } } } 

    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; } } 

    Ich habe es selbst gelöst, indem ich den Itemrand und die RecyclerView-Auflage stelle. Sowohl Rand als auch Polsterung sind die Hälfte des erwarteten Raumes, so dass das Problem verschwunden ist.

    Setzen Sie den linken / rechten Raum in ItemDecoration nach Spanindex nur funktioniert gut für Artikelansicht hat feste Größe. Wenn die Positionsansicht die Bildansicht enthält, wrap_content in der Höhe setzen, kann die Positionsansicht die Spanposition ändern, aber der Spanneindex wird nicht aktualisiert, wie Sie es wünschen, der Rand wird ein Durcheinander sein.

    Mein Weg ist, mit dem symmetrischen linken / rechten Raum für Ansicht Einzelteil.

     @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; } } 

    Dann setze 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"/> 

    Ich würde leicht ändern und modifizieren beide der Antwort für relative Frage

     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; } } } 
     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 ); } } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.