Margin/padding in last Child in RecyclerView

前端 未结 9 975
醉话见心
醉话见心 2021-01-30 05:56

I\'m trying to add Padding/Margin Bottom in the last row and Padding/Margin Top in the first row. I can not do it in the item xml as it would affect all of my Children.

I

相关标签:
9条回答
  • 2021-01-30 06:42

    For some reason the old clipToPadding=false solution isn't working for me. So I added an 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);
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-30 06:43

    Java equivalent to @Radesh answer:

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (position == itemsList.size() - 1) {
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) holder.itemView.getLayoutParams();
            params.bottomMargin = 100;
            holder.itemView.setLayoutParams(params);
        } else {
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) holder.itemView.getLayoutParams();
            params.bottomMargin = 0;
            holder.itemView.setLayoutParams(params);
        }
    }
    
    0 讨论(0)
  • 2021-01-30 06:45

    use 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) {
            int position = parent.getChildAdapterPosition(view);
            boolean isLast = position == state.getItemCount()-1;
            if(isLast){
                outRect.bottom = space;
                outRect.top = 0; //don't forget about recycling...
            }
            if(position == 0){
                outRect.top = space;
                // don't recycle bottom if first item is also last
                // should keep bottom padding set above
                if(!isLast)
                    outRect.bottom = 0;
            }
        }
    }
    

    and

    //8dp as px
    int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8,
                getResources().getDisplayMetrics()); // calculated
    //int space = getResources().getDimensionPixelSize(
    //    R.dimen.list_item_padding_vertical); // from resources
    recyclerView.addItemDecoration(new SpacesItemDecoration(space));
    
    0 讨论(0)
提交回复
热议问题