Android 自定義LayoutManager實現(xiàn)花式表格
如果你對RecyclerView原理還不是特別了解,非常建議你讀一下。
本文的項目也是學(xué)習(xí)自定義LayoutManager絕佳資料,大家有需要的可以好好拜讀。
前言
表格是自打我進公司以后就使用的控件,起初使用的是ScrollablePanel,從一開始的被花式吊打,到后期的熟練使用。

大佬寫的控件確實給我的工作帶來了極大的方便,不過還是有些問題存在:
- 無法實現(xiàn)不規(guī)則的表格
- 其核心是二層RecyclerView的嵌套,如果只用一層RecyclerView將會帶來性能的提升
- 多個RecyclerView有的時候會導(dǎo)致界面變形
在我深入學(xué)習(xí)RecyclerView以后,想能不能只用一層RecyclerView,借助LayoutManager實現(xiàn),寫著寫著,發(fā)現(xiàn)該思路可行,并實現(xiàn)了一款基于一個RecyclerView的表格控件TableView,先看一下效果:
照片墻

經(jīng)??吹接型瑢W(xué)問類似的首頁如何實現(xiàn),現(xiàn)在不用自定義View也可以輕松實現(xiàn)了哈~
課程表

表格

TableView具有如下特點:
- 支持不規(guī)則表格
- 同時支持橫向和縱向滾動
- 支持頂部和左側(cè)懸浮
- 基于RecyclerView,所以RecyclerView自定義子視圖、高效回收、子視圖多樣性這些特點它都有
- 沒有多層RecyclerView嵌套,性能更棒
使用
第一步 | 添加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中的主要函數(shù):

這個setTitle(boolean isLeftOpen, boolean isTopOpen)有什么作用呢?為了確保表格的每一個單元格的長度和寬度都一樣(子視圖可以在橫縱方向上占有多個單元格),寬和高都使用兩種方式:
- 設(shè)置具體的值,那么單元格的寬或者高的值就是具體的
- 設(shè)置一行或者一列可以容納的單元格數(shù)量
所以寬高各有兩種,模式的數(shù)量 = 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);
第三步 | 創(chuàng)建數(shù)據(jù)類
實現(xiàn)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;
//... 省略構(gòu)造函數(shù)和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;
}
}
第四步 | 設(shè)置適配器
private TableAdapter<TableCell> mAdapter;
protected void initWidget(View root) {
// 假設(shè)在這個方法中初始化
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是子視圖布局文件
// 根據(jù)布局返回具體的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());
總結(jié)
總的來說,TableView的核心是TableLayoutManager,也就是RecyclerView中的LayoutManager,類似于可以隨時橫縱向切換的GridLayoutManager,如果各位同學(xué)對TableView感興趣,我將會在后續(xù)的文章深入原理。
最后對于程序員來說,要學(xué)習(xí)的知識內(nèi)容、技術(shù)有太多太多,要想不被環(huán)境淘汰就只有不斷提升自己,從來都是我們?nèi)ミm應(yīng)環(huán)境,而不是環(huán)境來適應(yīng)我們!
以上所述是小編給大家介紹的Android 自定義LayoutManager實現(xiàn)花式表格,希望對大家有所幫助!
相關(guān)文章
淺談Android實踐之ScrollView中滑動沖突處理解決方案
涉及到了ViewPager,MapView,ListView,就需要ScrollView來做一下支援,這篇文章主要介紹了淺談Android實踐之ScrollView中滑動沖突處理解決方案,有需要的可以來了解一下。2016-12-12
Android實現(xiàn)Neumorphism?UI控件
大家好,本篇文章主要講的是Android實現(xiàn)Neumorphism?UI控件,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02
Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例
本篇文章主要介紹了Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例,具有一定的參考價值,有需要的可以了解一下。2016-12-12
Android中Glide加載到RelativeLayout背景圖方法示例
Glide框架大家應(yīng)該都很熟悉,我們可以使用Glide加載網(wǎng)絡(luò)圖片、加載gif圖片,使用簡單。下面這篇文章主要給大家介紹了關(guān)于Android中Glide加載到RelativeLayout背景圖的相關(guān)資料,需要的朋友可以參考下。2017-12-12
android 判斷網(wǎng)絡(luò)是否可用與連接的網(wǎng)絡(luò)是否能上網(wǎng)
下面小編就為大家分享一篇android 判斷網(wǎng)絡(luò)是否可用與連接的網(wǎng)絡(luò)是否能上網(wǎng),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

