Android recyclerview gridLayoutManager的分割線Decoration

最近用到了  需要九宮格的上下左右都有分割  於是上網找了好幾個  有一個用着還不錯  自己改了一下  在此記錄  

這個方法我嘗試了三四次   剛開始  總是有問題  不是第一列間距小了  就是沒有間距了   然後又換方法  最後又換了回來   發現是我的adapter裏面的item 寬度設置有問題   因爲使用的是GridLayoutManager   他是根據設置列數   然後等分的   我開始把item的寬度寫死xxdp了  然後就出現某一列的間距有問題   這裏面item的寬度要設置成match_parent   就可以了    

全部代碼  getItemOffsets裏面的代碼可以根據需求動態修改

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by admin on 2019/10/9.
 */

public class MyItemDecoration extends RecyclerView.ItemDecoration {
    private int space;
    private int color;
    private Paint mPaint;

    /**
     * 默認的,垂直方向 橫縱1px 的分割線 顏色透明
     */
    public MyItemDecoration() {
        this(1);
    }

    /**
     * 自定義寬度的透明分割線
     *
     * @param space 指定寬度
     */
    public MyItemDecoration(int space) {
        this(space, Color.TRANSPARENT);
    }

    /**
     * 自定義寬度,並指定顏色的分割線
     *
     * @param space 指定寬度
     * @param color 指定顏色
     */

    public MyItemDecoration(int space, int color) {
        this.space = space;
        this.color = color;
        initPaint();
    }


    private void initPaint() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(color);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setStrokeWidth(space);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        GridLayoutManager manager = (GridLayoutManager) parent.getLayoutManager();
        int childSize = parent.getChildCount();
        int span = manager.getSpanCount();
        //爲了Item大小均勻,將設定分割線平均分給左右兩邊Item各一半
        int offset = space / 2;
        //得到View的位置
        int childPosition = parent.getChildAdapterPosition(view);
        //第一排,頂部
        if (childPosition  < span) {
            //最左邊的
            if (childPosition  % span == 0) {
                outRect.set(space, space, offset, 0);
                //最右邊的
            } else if (childPosition  % span == span - 1) {
                outRect.set(offset, space, space, 0);
                //中間的
            } else {
                outRect.set(offset, space, offset, 0);
            }
        } else {
            //上下的分割線,就從第二排開始
            //最左邊的
            if (childPosition  % span == 0) {
                outRect.set(space, space, offset, 0);
                //最右邊的
            } else if (childPosition  % span == span - 1) {
                outRect.set(offset, space, space, 0);
                //中間的
            } else {
                outRect.set(offset, space, offset, 0);
            }
        }
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章