Android 自定義LayoutManager實(shí)現(xiàn)花式表格
如果你對(duì)RecyclerView原理還不是特別了解,非常建議你讀一下。
本文的項(xiàng)目也是學(xué)習(xí)自定義LayoutManager絕佳資料,大家有需要的可以好好拜讀。
前言
表格是自打我進(jìn)公司以后就使用的控件,起初使用的是ScrollablePanel,從一開始的被花式吊打,到后期的熟練使用。
大佬寫的控件確實(shí)給我的工作帶來了極大的方便,不過還是有些問題存在:
- 無法實(shí)現(xiàn)不規(guī)則的表格
- 其核心是二層RecyclerView的嵌套,如果只用一層RecyclerView將會(huì)帶來性能的提升
- 多個(gè)RecyclerView有的時(shí)候會(huì)導(dǎo)致界面變形
在我深入學(xué)習(xí)RecyclerView
以后,想能不能只用一層RecyclerView
,借助LayoutManager
實(shí)現(xiàn),寫著寫著,發(fā)現(xiàn)該思路可行,并實(shí)現(xiàn)了一款基于一個(gè)RecyclerView
的表格控件TableView
,先看一下效果:
照片墻
經(jīng)常看到有同學(xué)問類似的首頁如何實(shí)現(xiàn),現(xiàn)在不用自定義View也可以輕松實(shí)現(xiàn)了哈~
課程表
表格
TableView具有如下特點(diǎn):
- 支持不規(guī)則表格
- 同時(shí)支持橫向和縱向滾動(dòng)
- 支持頂部和左側(cè)懸浮
- 基于RecyclerView,所以RecyclerView自定義子視圖、高效回收、子視圖多樣性這些特點(diǎn)它都有
- 沒有多層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ù):
這個(gè)setTitle(boolean isLeftOpen, boolean isTopOpen)
有什么作用呢?為了確保表格的每一個(gè)單元格的長度和寬度都一樣(子視圖可以在橫縱方向上占有多個(gè)單元格),寬和高都使用兩種方式:
- 設(shè)置具體的值,那么單元格的寬或者高的值就是具體的
- 設(shè)置一行或者一列可以容納的單元格數(shù)量
所以寬高各有兩種,模式的數(shù)量 = 2 * 2,總共有:
代碼:
// if use butterknife // or use findViewById @BindView(R.id.tb) TableView mTable; // 默認(rèn)為 TableLayoutManager.MODE_A, 4, 8 mTable.setModeAndValue(TableLayoutManager.MODE_A, 6, 8);
第三步 | 創(chuàng)建數(shù)據(jù)類
實(shí)現(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è)在這個(gè)方法中初始化 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
,類似于可以隨時(shí)橫縱向切換的GridLayoutManager
,如果各位同學(xué)對(duì)TableView
感興趣,我將會(huì)在后續(xù)的文章深入原理。
最后對(duì)于程序員來說,要學(xué)習(xí)的知識(shí)內(nèi)容、技術(shù)有太多太多,要想不被環(huán)境淘汰就只有不斷提升自己,從來都是我們?nèi)ミm應(yīng)環(huán)境,而不是環(huán)境來適應(yīng)我們!
以上所述是小編給大家介紹的Android 自定義LayoutManager實(shí)現(xiàn)花式表格,希望對(duì)大家有所幫助!
相關(guān)文章
Android短信驗(yàn)證碼監(jiān)聽解決onChange多次調(diào)用的方法
本篇文章主要介紹了Android短信驗(yàn)證碼監(jiān)聽解決onChange多次調(diào)用的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Android FTP 多線程斷點(diǎn)續(xù)傳下載\上傳的實(shí)例
本篇文章主要介紹了Android FTP 多線程斷點(diǎn)續(xù)傳下載\上傳的實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08android使用include調(diào)用內(nèi)部組件的方法
這篇文章主要介紹了android使用include調(diào)用內(nèi)部組件的方法,涉及Android組件調(diào)用的相關(guān)技巧,需要的朋友可以參考下2015-05-05Android使用criteria選擇合適的地理位置服務(wù)實(shí)現(xiàn)方法
這篇文章主要介紹了Android使用criteria選擇合適的地理位置服務(wù)實(shí)現(xiàn)方法,實(shí)例分析了Criteria的具體使用技巧,需要的朋友可以參考下2016-01-01Android中關(guān)于CoordinatorLayout的一些實(shí)用布局技巧
大家都知道CoordinatorLayout是一個(gè)“加強(qiáng)版”的 FrameLayout,那么下面這篇文章主要給大家分享了Android中關(guān)于CoordinatorLayout的一些布局技巧,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06Android自定義控件深入學(xué)習(xí) Android生成隨機(jī)驗(yàn)證碼
這篇文章主要再次為大家介紹了Android自定義控件,以及針對(duì)自定義view學(xué)習(xí),實(shí)戰(zhàn)演練了Android生成隨機(jī)驗(yàn)證碼的詳細(xì)過程,感興趣的小伙伴們可以參考一下2016-01-01Android使用RecyclerView實(shí)現(xiàn)投票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android使用RecyclerView實(shí)現(xiàn)投票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11