多布局侧滑Adapter继承SwipeMenuAdapter,解决侧滑带动标题,自定义ItemDecoration 实现多布局

文字描述不是很清楚,请看下图:

                       多布局侧滑Adapter继承SwipeMenuAdapter,解决侧滑带动标题,自定义ItemDecoration 实现多布局_第1张图片

 

刚开始的逻辑都是直接在多类型布局里面转圈,但是后来发现多类型布局就算是加上去了3天前的这个布局,item里面添加隐藏显示布局,也会有侧滑这个东东,重点是使用了这个继承SwipeMenuAdapter,所有的item都有侧滑的,所以只能放弃,转战其它方向,后来想着好像一个recyclerview 套用两个recyclerview和一个标题也能实现,但是觉得太麻烦了,只能去想分割线看看能否实现,先随便网上找了一个自定义的分割线,把文字绘制了上去,发现真的行。


效果图如下:

 

                       多布局侧滑Adapter继承SwipeMenuAdapter,解决侧滑带动标题,自定义ItemDecoration 实现多布局_第2张图片


数据就不用在意了,是测试数据来的。下面是使用方法和自定义的分割线:

 

swipeMenuRecyclerView.addItemDecoration(new CustomDecoration(this, CustomDecoration.VERTICAL_LIST, R.drawable.divider_love, DensityUtil.dip2px(this, 15)));


public class CustomDecoration extends RecyclerView.ItemDecoration {

    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

    private Drawable mDivider;

    private int mOrientation;
    /**
     * 分割线缩进值
     */
    private int inset;

    private Paint paint;

    private Paint backPaint;

    private String promptLunguage;


    /**
     * @param context
     * @param orientation layout的方向
     * @param drawable    引入的drawable的ID
     * @param inset       分割线缩进值
     */
    public CustomDecoration(Context context, int orientation, int drawable, int inset) {
        mDivider = context.getResources().getDrawable(drawable);
        promptLunguage = context.getResources().getString(R.string.apply_three_day_ago);
        this.inset = inset;
        paint = new Paint();
        paint.setColor(context.getResources().getColor(R.color.color_a5a5a5));
        //设置画笔宽度
        paint.setStrokeWidth(5);
        paint.setTextSize(40);
        backPaint = new Paint();
        backPaint.setColor(context.getResources().getColor(R.color.color_f3f3f3));
        setOrientation(orientation);
    }

    public void setOrientation(int orientation) {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent) {
        if (mOrientation == VERTICAL_LIST) {
            drawVertical(c, parent);
        }
    }

    private void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();
        MenuAdapter adapter = (MenuAdapter) parent.getAdapter();

        final int childCount = parent.getChildCount();
        //最后一个item不画分割线
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            if (i == adapter.getThreeDayAgo()) {
                final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
                final int top = child.getTop() + child.getPaddingTop();
                final int bottom = top + mDivider.getIntrinsicHeight();
                c.drawRect(left, top- SizeUtils.dp2px(40), right, bottom, backPaint);
                if (inset > 0) {
                    mDivider.setBounds(left, top- SizeUtils.dp2px(40), right, bottom);
                } else {
                    mDivider.setBounds(left, top- SizeUtils.dp2px(40), right, bottom);
                }
                c.drawText(promptLunguage, left + inset, top - inset, paint);
                mDivider.draw(c);
            }

        }
    }


    //由于Divider也有宽高,每一个Item需要向下或者向右偏移
    @Override
    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
        if (mOrientation == VERTICAL_LIST) {
            if (itemPosition == 1) {
                outRect.set(0,  mDivider.getIntrinsicHeight(), 0,0);
            }
        }
    }
}

 

divider_love.xml



    
    

 




 

你可能感兴趣的:(android)