Android 自定义LayoutManager实现花式表格
如果你对RecyclerView原理还不是特别了解,非常建议你读一下。
本文的项目也是学习自定义LayoutManager绝佳资料,大家有需要的可以好好拜读。
前言
表格是自打我进公司以后就使用的控件,起初使用的是ScrollablePanel,从一开始的被花式吊打,到后期的熟练使用。
大佬写的控件确实给我的工作带来了极大的方便,不过还是有些问题存在:
- 无法实现不规则的表格
- 其核心是二层RecyclerView的嵌套,如果只用一层RecyclerView将会带来性能的提升
- 多个RecyclerView有的时候会导致界面变形
在我深入学习RecyclerView
以后,想能不能只用一层RecyclerView
,借助LayoutManager
实现,写着写着,发现该思路可行,并实现了一款基于一个RecyclerView
的表格控件TableView
,先看一下效果:
照片墙
经常看到有同学问类似的首页如何实现,现在不用自定义View也可以轻松实现了哈~
课程表
表格
TableView具有如下特点:
- 支持不规则表格
- 同时支持横向和纵向滚动
- 支持顶部和左侧悬浮
- 基于RecyclerView,所以RecyclerView自定义子视图、高效回收、子视图多样性这些特点它都有
- 没有多层RecyclerView嵌套,性能更棒
Github地址
使用
第一步 | 添加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)
有什么作用呢?为了确保表格的每一个单元格的长度和宽度都一样(子视图可以在横纵方向上占有多个单元格),宽和高都使用两种方式:
- 设置具体的值,那么单元格的宽或者高的值就是具体的
- 设置一行或者一列可以容纳的单元格数量
所以宽高各有两种,模式的数量 = 2 * 2,总共有:
代码:
// 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());
总结
总的来说,TableView
的核心是TableLayoutManager
,也就是RecyclerView
中的LayoutManager
,类似于可以随时横纵向切换的GridLayoutManager
,如果各位同学对TableView
感兴趣,我将会在后续的文章深入原理。
最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
以上所述是小编给大家介绍的Android 自定义LayoutManager实现花式表格,希望对大家有所帮助!
- Web应用渗透测试-本地文件包含
- shiro权限控制(二):分布式架构中shiro的实现
- Groovy实现原理分析——准备工作
- HBCTF第一场2个pwn题的简单分析
- ACM竞赛之输入输出(以C与C++为例)
- 能让程序做的事情坚决不用人来做——批量修复markdownlint MD034警告
- swift demo1 tableview
- Swift Alamofire
- 给Ocelot做一个Docker 镜像
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十一)
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](九)
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)
- 第二届ZCTF逆向题分析(一)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 微服务开源框架TARS 之 基础组件
- Gitlab-ci:从零开始的前端自动化部署
- 从 1 到 0 构建博客项目(导读)
- 应该在JavaScript中使用Class吗
- Go语言小书 | 关于编译和语法
- Go语言小书 | 小试牛刀,从hello world开始
- 3分钟短文 | Laravel 中间件传递数据到控制器
- 3分钟短文 | Laravel 表单验证数组的数据
- 3分钟短文:Laravel 编程中优雅地添加定义常量
- 极客算法训练笔记(四),栈和队列,从实际应用看数据结构
- 微博爬虫出错居然还和网络运营商有关
- 8.深入k8s:资源控制Qos和eviction及其源码分析
- 1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知
- CNN不用乘法? AdderNet和DeepShift论文理解
- 动手构建地铁关系网,实现最短路径查询