/GridConstraintLayout

A grid layout base on constraint layout

Primary LanguageJava

GridConstraintLayout

一个基于ConstraintLayout实现的网格布局

接入方式

build.gradle文件中添加如下代码

compile 'com.jerry.gcl:gridconstraintlayout:1.3@aar'

API

属性

<attr name="gcl_row_count" format="integer" />

网格布局有多少行

<attr name="gcl_col_count" format="integer" />

网格布局有多少列

<attr name="gcl_hor_padding" format="dimension" />

网格内横向间距

<attr name="gcl_ver_padding" format="dimension" />

网格内纵向间距

方法

public View setCell(@NonNull final CellBuilder cellBuilder) throws Exception

设置网格原子,提供原子构造器,返回已添加到网格的原子View

参数 含义
cellBuilder 原子构造器

public void removeCell(final int cellRow, final int cellCol)

移除指定位置的原子

参数 含义
cellRow 原子在第几行
cellCol 原子在第几列

public void setSize(final int rowCount, final int colCount)

设置网格行列数,已支持在有内容的情况下修改网格行列数(超出范围的原子会被清除)

参数 含义
rowCount 网格有多少行
colCount 网格有多少列

public View getCellView(final int cellRow, final int cellCol)

获取指定位置的原子View,提供行列数,返回网格中指定位置原子View

参数 含义
cellRow 要获取的原子在第几行
cellCol 要获取的原子在第几列

public int getRowCount()

获取网格有多少行


public int getColCount()

获取网格有多少列

原子构造器(CellBuilder)

public CellBuilder(@NonNull final GridConstraintLayout parent, @LayoutRes final int layoutId, final int cellRow, final int cellCol) throws NullPointerException

提供布局文件来构造原子

参数 含义
parent 网格布局
layoutId 布局文件
cellRow 原子所在行数
cellCol 原子所在列数

public CellBuilder(final View view, final int cellRow, final int cellCol) throws NullPointerException

提供View来构造原子

参数 含义
view 原子View
cellRow 原子所在行数
cellCol 原子所在列数

public CellBuilder size(final int viewWidth, final int viewHeight)

设置原子View的宽高,如果LayoutParams指定了宽高可以不设置

参数 含义
viewWidth 原子View宽度
viewHeight 原子View高度

public CellBuilder span(final int rowSpan, final int colSpan)

设置原子所跨的行列数

参数 含义
rowSpan 所跨行数
colSpan 所跨列数

public CellBuilder gravity(final int gravity)

设置原子Gravity

参数 含义
gravity 参考android.view.Gravity

示例

final GridConstraintLayout gclWrapContainer = findViewById(R.id.gcl_wrap_container);
try {
    TextView view = new TextView(this);
    view.setText("1");
    view.setBackgroundColor(colorArray[0]);
    gclWrapContainer.setCell(new GridConstraintLayout.CellBuilder(view, 0, 0).size(100, ConstraintSet.WRAP_CONTENT));
    view = new TextView(this);
    view.setText("2");
    view.setBackgroundColor(colorArray[1]);
    gclWrapContainer.setCell(new GridConstraintLayout.CellBuilder(view, 0, 2).size(100, ConstraintSet.WRAP_CONTENT));
    view = new TextView(this);
    view.setText("3");
    view.setBackgroundColor(colorArray[2]);
    gclWrapContainer.setCell(new GridConstraintLayout.CellBuilder(view, 0, 3).size(ConstraintSet.WRAP_CONTENT, ConstraintSet.WRAP_CONTENT).gravity(Gravity.RIGHT));
    view = new TextView(this);
    view.setText("4");
    view.setBackgroundColor(colorArray[3]);
    gclWrapContainer.setCell(new GridConstraintLayout.CellBuilder(view, 1, 0).size(210, ConstraintSet.WRAP_CONTENT).span(1, 2).gravity(Gravity.LEFT | Gravity.TOP));
    view = new TextView(this);
    view.setText("5");
    view.setBackgroundColor(colorArray[4]);
    gclWrapContainer.setCell(new GridConstraintLayout.CellBuilder(view, 1, 2).size(210, ConstraintSet.WRAP_CONTENT).span(1, 2));
} catch (Exception e) {
    e.printStackTrace();
}

AdapterView中使用方式,因为复用原因需要先检查是否已有原子

public View getView(int position, View convertView, ViewGroup parent){
    final GridConstraintLayout gclContainer;
    ItemView itemView = (ItemView) gclContainer.getCellView(0, i);
    if (itemView == null) {
        try {
            itemView = (ItemView) gclContainer.setCell(new GridConstraintLayout.CellBuilder(new ItemView(context, 0, i).size(ConstraintSet.MATCH_CONSTRAINT, ConstraintSet.WRAP_CONTENT));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

demo_img