写点什么

LayoutManager 高端玩家,实现花式表格,kotlin 中文

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

大佬写的控件确实给我的工作带来了极大的方便,不过还是有些问题存在:


  • 无法实现不规则的表格

  • 其核心是二层 RecyclerView 的嵌套,如果只用一层 RecyclerView 将会带来性能的提升

  • 多个 RecyclerView 有的时候会导致界面变形


在我深入学习 RecyclerView 以后,想能不能只用一层 RecyclerView,借助 LayoutManager 实现,写着写着,发现该思路可行,并实现了一款基于一个 RecyclerView 的表格控件 TableView,先看一下效果:

[](

)照片墙



经常看到有同学问类似的首页如何实现,现在不用自定义 View 也可以轻松实现了哈~

[](

)课程表



表格


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8yMTI3NDk0My05YjI3YmZjYzc0NTAwZWIx?x-oss-p


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


rocess=image/format,png)


TableView 具有如下特点:


  • 支持不规则表格

  • 同时支持横向和纵向滚动

  • 支持顶部和左侧悬浮

  • 基于 RecyclerView,所以 RecyclerView 自定义子视图、高效回收、子视图多样性这些特点它都有

  • 没有多层 RecyclerView 嵌套,性能更棒


Github 地址: https://github.com/mCyp/Orient-Ui


[](


)_2_使用



[](

)第一步 | 添加 xml 文件


<?xml version="1.0" encoding="utf-8"?>


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"


xmlns:tools="http://schemas.android.com/tools"


android:layout_width="match_parent"


android:layout_height="match_parent"


tools:context=".ui.fragment.table.TableFragment">


<com.orient.me.widget.rv.adapter.TableView


android:id="@+id/tb"


android:layout_width="match_parent"


android:layout_height="match_parent"/>


</FrameLayout>

[](

)第二步 | 获取 TableView


在展示代码之前,了解一下 TableView 中的主要函数:


| 方法 | 描述 |


| --- | --- |


| setTitle(boolean isLeftOpen, boolean isTopOpen) | 左侧或者上侧的悬浮标题是否显示,默认显示 |


| 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;


}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
LayoutManager高端玩家,实现花式表格,kotlin中文