中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 自定義LayoutManager實現花式表格

發布時間:2020-09-02 12:33:29 來源:腳本之家 閱讀:301 作者:Android-until 欄目:移動開發

如果你對RecyclerView原理還不是特別了解,非常建議你讀一下。

本文的項目也是學習自定義LayoutManager絕佳資料,大家有需要的可以好好拜讀。

前言

表格是自打我進公司以后就使用的控件,起初使用的是ScrollablePanel,從一開始的被花式吊打,到后期的熟練使用。

Android 自定義LayoutManager實現花式表格

大佬寫的控件確實給我的工作帶來了極大的方便,不過還是有些問題存在:

  • 無法實現不規則的表格
  • 其核心是二層RecyclerView的嵌套,如果只用一層RecyclerView將會帶來性能的提升
  • 多個RecyclerView有的時候會導致界面變形

在我深入學習RecyclerView以后,想能不能只用一層RecyclerView,借助LayoutManager實現,寫著寫著,發現該思路可行,并實現了一款基于一個RecyclerView的表格控件TableView,先看一下效果:

照片墻

Android 自定義LayoutManager實現花式表格

經常看到有同學問類似的首頁如何實現,現在不用自定義View也可以輕松實現了哈~

課程表

Android 自定義LayoutManager實現花式表格

表格

Android 自定義LayoutManager實現花式表格

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中的主要函數:

Android 自定義LayoutManager實現花式表格

這個setTitle(boolean isLeftOpen, boolean isTopOpen)有什么作用呢?為了確保表格的每一個單元格的長度和寬度都一樣(子視圖可以在橫縱方向上占有多個單元格),寬和高都使用兩種方式:

  • 設置具體的值,那么單元格的寬或者高的值就是具體的
  • 設置一行或者一列可以容納的單元格數量

所以寬高各有兩種,模式的數量 = 2 * 2,總共有:

Android 自定義LayoutManager實現花式表格

代碼:

// 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_AMode_CMode_D,需要再重新測量:

mTable.post(() -> mTable.reMeasure());

總結

總的來說,TableView的核心是TableLayoutManager,也就是RecyclerView中的LayoutManager,類似于可以隨時橫縱向切換的GridLayoutManager,如果各位同學對TableView感興趣,我將會在后續的文章深入原理。

最后對于程序員來說,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提升自己,從來都是我們去適應環境,而不是環境來適應我們!

以上所述是小編給大家介紹的Android 自定義LayoutManager實現花式表格,希望對大家有所幫助!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陕西省| 当涂县| 日喀则市| 邯郸县| 雷山县| 犍为县| 抚顺市| 弥渡县| 新余市| 铜梁县| 滦平县| 五常市| 新兴县| 武陟县| 涪陵区| 新蔡县| 海南省| 太康县| 织金县| 仁布县| 博白县| 上高县| 洞头县| 行唐县| 淳化县| 中牟县| 阿瓦提县| 深水埗区| 拉萨市| 奉贤区| 岑巩县| 东山县| 年辖:市辖区| 丹凤县| 页游| 柘城县| 昭通市| 天镇县| 西乌珠穆沁旗| 民乐县| 岳普湖县|