LayoutManager 高端玩家,实现花式表格 (1),安卓面试题高级
| --- | --- |
| setTitle(boolean isLeftOpen, boolean isTopOpe
n) | 左侧或者上侧的悬浮标题是否显示,默认显示 |
| setModeAndValue(int mode, int w, int h) | mode-表格模式、w-具体的宽度\一行容纳的单元格数、h-具体的高度\一列容纳的单元格数 |
这个 setTitle(boolean isLeftOpen, boolean isTopOpen)有什么作用呢?为了确保表格的每一个单元格的长度和宽度都一样(子视图可以在横纵方向上占有多个单元格),宽和高都使用两种方式:
设置具体的值,那么单元格的宽或者高的值就是具体的
设置一行或者一列可以容纳的单元格数量
所以宽高各有两种,模式的数量 = 2 * 2,总共有:
| Mode 模式 | w 的说明 | h 的说明 |
| --- | --- | --- |
| TableLayoutManager.MODE_A | 父布局一行容纳的单元格数 | 父布局一列容纳的单元格数 |
| TableLayoutManager.MODE_B | 单元格宽度 | 单元格高度 |
| TableLayoutManager.MODE_C | 父布局一行容纳的单元格数 | 单元格高度 |
| TableLayoutManager.MODE_D | 单元格宽度 | 父布局一列容纳的单元格数 |
代码:
// if use butterknife
// or use findViewById
@BindView(R.id.tb)
TableView mTable;
// 默认为 TableLayoutManager.MODE_A, 4, 8
mTable.setModeAndValue(TableLayoutManager.MODE_A, 6, 8);
[](
)第三步 | 创建数据类
实现 ICellItem 接口:
public class TableCell implements ICellItem {
private String name;
private String value;
private int type;
private int row;
private int col;
private int widthSpan;
private int heightSpan;
//... 省略构造函数和 Get Set 方法
@Override
public int getRow() {
return row;
}
@Override
public int getCol() {
return col;
}
@Override
public int getWidthSpan() {
return widthSpan;
}
@Override
public int getHeightSpan() {
return heightSpan;
}
}
[](
)第四步 | 设置适配器
private TableAdapter<TableCell> mAdapter;
protected void initWidget(View root) {
// 假设在这个方法中初始化
mTable.setAdapter(mAdapter = new TableAdapter<TableCell>(new ArrayList<>()) {
@Override
public int getItemLayout(TableCell tableCell, int pos) {
// ... 返回子视图布局文件
// 支持多类型
return R.layout.table_cell_content_item;
}
@Override
public BaseAdapter.ViewHolder<TableCell> onCreateViewHolder(View root, int itemType) {
// itemType 是子视图布局文件
// 根据布局返回具体的 ViewHolder
return new ContentHolder(root);
}
});
}
// 具体的 ViewHolder
class ContentHolder extends BaseAdapter.ViewHolder<TableCell>{
TextView mContent;
public ContentHolder(View itemView) {
super(itemView);
mContent = itemView.findViewById(R.id.tv_name);
}
@Override
protected void onBind(TableCell tableCell) {
mContent.setText(tableCell.getValue());
}
}
[](
)第五步 | 重新测绘
如果 TableView 使用的模式是 Mode_A、Mode_C 和 Mode_D,需要再重新测量:
mTable.post(()?->?mTable.reMeasure());
评论