2015-03-20 20 views
7

Sto cercando di implementare un RecyclerView come un UICollectionView in iOS. Voglio impostare un contentInset nella parte inferiore della vista del riciclatore ma non riesco a trovare un'opzione per farlo.Set contentInset in RecyclerView

C'è qualcosa di simile per Android?

risposta

6

soluzione è semplice:

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

Questo. La soluzione più semplice di gran lunga. –

0

Ho risolto questo aggiungendo una cella RecyclerView personalizzata che aggiunge un offset alla fine della vista con un colore di sfondo chiaro.

+0

Funziona ... ma sembra sbagliato ... ho passato per lo stesso visto che non ci sono altri suggerimenti. Ci deve essere una soluzione migliore però! – CMash

1

Ho creato un adattatore wrapper per ottenere questo risultato, che isola bene il codice. Ma, vorrei una soluzione migliore ..

public class HeaderSpaceWrapperAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private static final int TYPE_HEADER = 0x4711; 
    private int mSpace; 
    RecyclerView.Adapter mAdapter; 


    public HeaderSpaceWrapperAdapter(RecyclerView.Adapter adapter, int space) { 
     mAdapter = adapter; 
     mSpace = space; 

     mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
      @Override 
      public void onChanged() { 
       notifyDataSetChanged(); 
      } 
     }); 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType == TYPE_HEADER) { 
      return new ViewHolder(new Spacer(parent.getContext(), mSpace)); 
     } 

     return mAdapter.onCreateViewHolder(parent, viewType); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (position > 0) { 
      mAdapter.onBindViewHolder(holder, position - 1); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return 1 + mAdapter.getItemCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position == 0 ? TYPE_HEADER : mAdapter.getItemViewType(position - 1); 
    } 

    private class ViewHolder extends RecyclerView.ViewHolder { 

     public ViewHolder(View view) { 
      super(view); 
     } 
    } 
} 

Poi usarlo:

mWrapperAdapter = new HeaderSpaceWrapperAdapter(mAdapter, 100); 
mRecyclerView.setAdapter(mWrapperAdapter); 
0

Anche se questa domanda è più di un anno fa, ho pensato di condividere quello che ho fatto, qualcuno potrebbe piace, o semplicemente non vuole scrivere e può con ciò copiare/incollare: D.

La mia soluzione era aggiungere un margine inferiore all'ultimo elemento.

prima cosa determinare che è l'ultimo elemento:

@Override 
public void onBindViewHolder(final ItemViewHolder holder, int position) { 

    .... 
    Your other code 
    .... 

    // Check if it is the last item and the list is not empty. 
    if(position == mItems.size()-1) { 
     // If so, add some margin to the element 
     holder.setBottomMargin(R.dimen.last_item_offset); // some dimension (or set a fixed amount of pixels 
    } 
} 

poi ho un metodo nel viewholder per impostare il margine inferiore.

class ItemViewHolder extends RecyclerView.ViewHolder { 
    private View mRootView; 
    private Context mContext; 

    public ItemViewHolder(View itemView) { 
     super(itemView); 
     mRootView = itemView; 
     mContext = itemView.getContext(); 
     // do more stuff like binding views, etc 
    } 

    public void setBottomMargin(@DimenRes int margin){ 
     RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) mRootView.getLayoutParams(); 
     layoutParams.bottomMargin = (int)getContext().getResources().getDimension(margin); 
     mRootView.setLayoutParams(layoutParams); 
    } 
} 

E per la completezza di questo esempio, la dimensione

<resources>  
    <dimen name="spot_list_footer_position_offset">-56dp</dimen> 
</resources> 

Spero che questo sia quello che stavi cercando.

0

Questa risposta sarà un miglioramento per @Phin risposta

@Override 
public void onBindViewHolder(final ItemViewHolder holder, int position) { 

    .... 
    Your other code 
    .... 
    // Check if it is the last item and the list is not empty. 
      if(i == arraylist.size()-1) { 
       // If so, add some margin to the element 
       itemHolder.setBottomMargin(R.dimen.quick_controls_height); // some dimension (or set a fixed amount of pixels 
      } else { 
       itemHolder.setBottomMargin(R.dimen.zero_margin); //Set zero margin as the views will be reused. 
      } 

} 

dimens.xml:

<dimen name="quick_controls_height">34.1dp</dimen> 
<dimen name="zero_margin">0dp</dimen> 
1

È possibile creare il proprio ItemDecoration e impostare lì un offset per il primo oggetto e anche i margini tra gli articoli.

Ecco il mio codice per il mio riciclo a scorrimento orizzontale.

public class HorizontalContentItemDecoration extends RecyclerView.ItemDecoration { 
    private int startOffset = 10; 
    private int itemOffset = 10; 

    public HorizontalContentItemDecoration(int startOffset, int itemOffset) { 
    this.startOffset = startOffset; 
    this.itemOffset = itemOffset; 
    } 

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

    int position = parent.getChildAdapterPosition(view); 

    if (position == 0) { 
     outRect.set(startOffset, 0, itemOffset, 0); 
    } else { 
     outRect.set(0, 0, itemOffset, 0); 
    } 
    } 
} 
Problemi correlati