RecyclerView 隐藏部分分割线

在项目中遇到复杂点的RecyclerView,可能会有隐藏部分分割线的需求,例如item1和item3之间的分割线隐藏,item4和item5之间的分割线隐藏等。


在看了文档里的ItemDecoration类后,可以发现这样三个方法:

getItemOffsets、onDraw和onDrawOver。

onDraw可以通过一些列c.draw的方法在itemView绘制之前绘制我们需要的内容。

onDrawOver与onDraw类似,只不过是在绘制itemView之后绘制,具体表现形式,就是绘制的内容在itemview上层。

这两个方法在这里不做讨论,重点关注getItemOffsets方法。


getItemOffsets可以通过outRect.set(l,t,r,b)设置指定itemview的paddingLeftpaddingToppaddingRightpaddingBottom。

在这里使用一个自定义的分割线去继承ItemDecoration,然后在需要隐藏的地方设置outRect.set(0,0,0,0),进而来实现隐藏分割线的效果。


以下代码隐藏了第一条与最后一条分割线。


public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;     //分割线Drawable
    private int mDividerHeight;  //分割线高度

    /**
     * 使用line_divider中定义好的颜色
     *
     * @param context
     * @param dividerHeight 分割线高度
     */
    public SimpleDividerItemDecoration(Context context, int dividerHeight) {
        mDivider = ContextCompat.getDrawable(context, R.drawable.ba_divider);
        mDividerHeight = dividerHeight;
    }

    /**
     * @param context
     * @param divider       分割线Drawable
     * @param dividerHeight 分割线高度
     */
    public SimpleDividerItemDecoration(Context context, Drawable divider, int dividerHeight) {
        if (divider == null) {
            mDivider = ContextCompat.getDrawable(context, R.drawable.ba_divider);
        } else {
            mDivider = divider;
        }
        mDividerHeight = dividerHeight;
    }

    //获取分割线尺寸
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        int childAdapterPosition = parent.getChildAdapterPosition(view);

        int lastCount = parent.getAdapter().getItemCount() - 1;

        if (childAdapterPosition == 0) {
            outRect.set(0, 0, 0, 0);
            return;
        }

        if (childAdapterPosition == lastCount) {
            outRect.set(0, 0, 0, 0);
            return;
        }
        outRect.set(0, 0, 0, mDividerHeight);

    }
}

猜你喜欢

转载自blog.csdn.net/sinat_33150417/article/details/78543728