RecyclerView remove divider / decorator after the last item

前端 未结 9 2022
礼貌的吻别
礼貌的吻别 2020-12-07 17:46

I have a quite simple RecyclerView.
This is how I set the divider:

DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), DividerI         


        
相关标签:
9条回答
  • 2020-12-07 18:09

    Here's the DividerDecorator class i use in my apps which removes the bottom line of last item.

    public class DividerDecorator extends RecyclerView.ItemDecoration {
        private Drawable mDivider;
    
        public DividerDecorator(Context context) {
            mDivider = context.getResources().getDrawable(R.drawable.recyclerview_divider);
        }
    
        @Override
        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
            int left = parent.getPaddingLeft();
            int right = parent.getWidth() - parent.getPaddingRight();
    
            int childCount = parent.getChildCount();
            for (int i = 0; i < childCount; i++) {
                View child = parent.getChildAt(i);
    
                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    
                int top = child.getBottom() + params.bottomMargin;
                int bottom = top + mDivider.getIntrinsicHeight();
    
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        }
    }
    

    You can set it to your RecyclerView with the following code:

    mRecyclerViewEvent.addItemDecoration(new DividerDecorator(context));
    

    Here's the recyclerview_divider.xml

    <size
        android:width="1dp"
        android:height="1dp" />
    
    <solid android:color="@color/DividerColor" />
    

    0 讨论(0)
  • 2020-12-07 18:09

    If u already set using:

        DividerItemDecoration dividerItemDecoration;
        dividerItemDecoration  = new DividerItemDecoration(context, 
        DividerItemDecoration.VERTICAL);
        mRecyclerView.addItemDecoration(dividerItemDecoration);
    

    and if you want to remove:

        mRecyclerView.removeItemDecoration(dividerItemDecoration);
    
    0 讨论(0)
  • 2020-12-07 18:10

    This is a customized version of Android support DividerItemDecoration which ignore the last item:

    https://gist.github.com/mohsenoid/8ffdfa53f0465533833b0b44257aa641

    main difference is:

    private fun drawVertical(canvas: Canvas, parent: RecyclerView) {
        canvas.save()
        val left: Int
        val right: Int
    
        if (parent.clipToPadding) {
            left = parent.paddingLeft
            right = parent.width - parent.paddingRight
            canvas.clipRect(left, parent.paddingTop, right,
                    parent.height - parent.paddingBottom)
        } else {
            left = 0
            right = parent.width
        }
    
        val childCount = parent.childCount
        for (i in 0 until childCount - 1) {
            val child = parent.getChildAt(i)
            parent.getDecoratedBoundsWithMargins(child, mBounds)
            val bottom = mBounds.bottom + Math.round(child.translationY)
            val top = bottom - mDivider!!.intrinsicHeight
            mDivider!!.setBounds(left, top, right, bottom)
            mDivider!!.draw(canvas)
        }
        canvas.restore()
    }
    
    private fun drawHorizontal(canvas: Canvas, parent: RecyclerView) {
        canvas.save()
        val top: Int
        val bottom: Int
    
        if (parent.clipToPadding) {
            top = parent.paddingTop
            bottom = parent.height - parent.paddingBottom
            canvas.clipRect(parent.paddingLeft, top,
                    parent.width - parent.paddingRight, bottom)
        } else {
            top = 0
            bottom = parent.height
        }
    
        val childCount = parent.childCount
        for (i in 0 until childCount - 1) {
            val child = parent.getChildAt(i)
            parent.layoutManager.getDecoratedBoundsWithMargins(child, mBounds)
            val right = mBounds.right + Math.round(child.translationX)
            val left = right - mDivider!!.intrinsicWidth
            mDivider!!.setBounds(left, top, right, bottom)
            mDivider!!.draw(canvas)
        }
        canvas.restore()
    }
    
    0 讨论(0)
提交回复
热议问题