Установка содержимогоInset в RecyclerView

Я пытаюсь реализовать RecyclerView как UICollectionView в iOS. Я хочу установить contentInset внизу представления recycler, но я не могу найти его вариант.

Есть что-то подобное для Android?

Решение прост:

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

Для этого я создал адаптер оболочки, который отлично изолирует код. Но я хотел бы получить лучшее решение.

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

Затем используйте его:

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

Я решил это добавить пользовательскую RecyclerView Cell, которая добавляет смещение в конце представления с четким цветом фона.

Хотя этот вопрос больше года, я думал, что поделюсь тем, что я сделал, кому-то может понравиться, или просто не хочет печатать и может копировать / вставлять: D.

Мое решение состояло в том, чтобы добавить нижний край к последнему элементу.

Сначала я определяю, что это последний элемент:

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

Затем у меня есть метод в узле просмотра, чтобы установить нижнее поле.

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

И для полноты этого примера размерность

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

Надеюсь, это то, что вы искали.

Этот ответ будет усилением ответа @Phin

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

Вы можете создать свой собственный ItemDecoration и установить там смещение для первого элемента, а также поля между элементами.

Вот мой код для моего горизонтального прокрутки recyclerview.

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