2015-11-17 7 views
44

Sto tentando di aggiungere Riempimento/margine inferiore nell'ultima riga e Riempimento/margine superiore nella prima riga. Non posso farlo nell'articolo xml in quanto ciò avrebbe effetto su tutti i miei Childs.Margine/riempimento ultimo Child in RecyclerView

devo intestazioni e bambino nel mio adattatore RecyclerView quindi non posso utilizzare il

android:padding="4dp" 
    android:clipToPadding="false" 

ho bisogno di usarlo individualmente sull'ultima prima riga di ogni intestazione

+0

Usa come questo: Dev

+0

si potrebbe cambiare l'imbottitura e il margine in onBindViewHolder e quindi chiamare setIsRecyclable (false) sul supporto vista – user3425867

risposta

22

uso ItemDecoration:

private 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) { 
     if(parent.getChildAdapterPosition(view) == state.getItemCount()-1){ 
      outRect.bottom = space; 
      outRect.top = 0; //don't forget about recycling... 
     } 
     if(parent.getChildAdapterPosition(view) == 0){ 
      outRect.top = space; 
      outRect.bottom = 0; 
     } 
    } 
} 

e

//8dp as px, value might be obtained e.g. from dimen resources... 
int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, 
      getResources().getDisplayMetrics()); 
recyclerView.addItemDecoration(new SpacesItemDecoration(space)); 
+1

Hey non sembra come RecyclerView.ItemDecoration ottenere la classe di risorse più, l'ho appena aggiunto come argum ent nel costruttore. – Krtko

+1

Soluzione Goog! Con supporto per il layout invertito: https://gist.github.com/Miha-x64/4e8754e72a1e65e3ca742744ea501f16 –

+0

questa risposta deve essere svalutata! Sebbene la risposta di Subin Sebastian stia funzionando bene, tuttavia, gli spazi di ItemDecoration non sono uguali. – iroiroys

26

Invece di aggiungere padding a entrambi gli elementi superiore e inferiore, è sufficiente aggiungere il padding nella parte superiore e inferiore di RecyclerView e impostare l'attributo clipToPadding su false.

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clipToPadding="false" 
    android:paddingTop="8dp" 
    android:paddingBottom="8dp" /> 
+0

Questa è la soluzione facile, ma ho intestazioni e childs nel mio RecyclerView quindi non posso usarlo – RedEagle

+0

@RedEagle Prova a vedere se ottieni l'effetto desiderato ma sono sicuro che funzioni. –

+1

voglio questa risposta, grazie :) –

87

Questo problema è ancora più facile da risolvere. È possibile applicare il padding necessario allo RecylerView stesso e impostare clipToPadding su falso, altrimenti il ​​padding taglierà l'area di scorrimento. Ecco un esempio

<android.support.v7.widget.RecyclerView 
    android:padding="4dp" 
    android:clipToPadding="false" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Vedere il padding aggiungerà 4dp su tutti i lati, inclusi superiore e inferiore. Quindi il parametro clipToPadding assicura che gli elementi figlio non vengano troncati. Ora aggiungi 4dp padding su tutti i lati per i tuoi oggetti figlio, e sei a posto. In totale si ottiene imbottitura 8dp sui lati e tra gli elementi.

+0

Sì, è così che lo faccio di solito, ma il mio RecyclerView è composto da intestazioni e ogni intestazione ha i suoi figli, è per questo che ho bisogno di impostarlo programmaticamente sull'ultima e prima riga di ogni solo intestazione – RedEagle

+0

Non sono sicuro di aver capito. Com'è collegato alle intestazioni all'interno di RecyclerView? Vuoi che le intestazioni non abbiano imbottitura? Anche se questo è il caso, puoi eliminare il padding sinistro e destro usando la stessa soluzione. –

+0

Ho intestazioni e ogni intestazione ha un conteggio non specifico di figli, quindi voglio aggiungere il margine superiore/margine e il primo margine inferiore e inferiore/margine all'ultimo figlio di ogni intestazione. – RedEagle

0

Per qualche motivo la vecchia soluzione clipToPadding=false non funziona per me. Così ho aggiunto un ItemDecoration

https://gist.github.com/kassim/582888fa5960791264fc92bc41fb6bcf

public class BottomPaddingDecoration extends RecyclerView.ItemDecoration { 
    private final int bottomPadding; 

    public BottomPaddingDecoration(int bottomPadding) { 
     this.bottomPadding = bottomPadding; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); 
     if (position == parent.getAdapter().getItemCount() - 1) { 
      outRect.set(0, 0, 0, bottomPadding); 
     } 
    } 
} 
-1

Il clipToPadding suggerimento non ha funzionato per me, ma ho trovato che l'uso di un NestedScrollView è una soluzione molto conveniente. Basta disabilitare lo scrolling su RecyclerView, metterlo in un layout con un po 'di padding in basso, e mettere il layout nel NestedScrollView.

Qualcosa di simile a questo:

<NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:paddingBottom="10dp"> 
     <RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:nestedScrollingEnabled="false" /> <!-- Don't miss this --> 
    </LinearLayout> 
</NestedScrollView>