首页 > 其他分享 >Android LayoutManager高端玩家,实现花式表格!

Android LayoutManager高端玩家,实现花式表格!

时间:2023-06-28 12:31:34浏览次数:40  
标签:TableView int 单元格 private public Android RecyclerView LayoutManager 花式


如果你对RecyclerView原理还不是特别了解,非常建议你读一下。

本文的项目也是学习自定义LayoutManager绝佳资料,大家有需要的可以好好拜读。

前言

表格是自打我进公司以后就使用的控件,起初使用的是ScrollablePanel,从一开始的被花式吊打,到后期的熟练使用。

Android LayoutManager高端玩家,实现花式表格!_安卓

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

  • 无法实现不规则的表格
  • 其核心是二层RecyclerView的嵌套,如果只用一层RecyclerView将会带来性能的提升
  • 多个RecyclerView有的时候会导致界面变形

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

照片墙

Android LayoutManager高端玩家,实现花式表格!_安卓_02

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

课程表

Android LayoutManager高端玩家,实现花式表格!_ide_03

表格

Android LayoutManager高端玩家,实现花式表格!_ide_04

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)

左侧或者上侧的悬浮标题是否显示,默认显示

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

    @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感兴趣,我将会在后续的文章深入原理。

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

标签:TableView,int,单元格,private,public,Android,RecyclerView,LayoutManager,花式
From: https://blog.51cto.com/u_16163453/6570456

相关文章

  • Android ‘Handler()‘ is deprecated
    privateHandlerhandler=newHandler();Handler()此构造函数在Android11/R之后已弃用。在Handler构造期间隐式选择Looper会导致操作无声地丢失(如果Handler不期待新任务并退出)、崩溃(如果有时在没有Looper活动的线程上创建处理程序)或竞争条件,处理程序关联的线程不......
  • Android线程管理之ExecutorService线程池
    为什么要引入线程池?   1.)newThread()的缺点每次newThread()耗费性能调用newThread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。不利于扩展,比如如定时执行、定期执行、线程中断  2.)采用线程池的优点重用存在的......
  • Android各版本 内外卡真实路径
    Android各版本内外卡真实路径【2.3.6】内卡:/mnt/sdcard(底层映射路径:/sdcard)外卡:/mnt/sdcard/external_sd(底层映射路径:/sdcard/external_sd)附:内外卡互换卡刷包http://pan.baidu.com/share/link?shareid=65738&uk=2197868393 【4.0.4】(CM9)内卡:/mnt/sdcard(底层映射路径:/sd......
  • Android使用poi遇到的问题
    原文:Android使用poi遇到的问题关于Poi使用可以看这一篇【开源库推荐】#4Poi-办公文档处理库本篇主要讲些在Android上使用出现的问题问题原本是需要一个导出xlsx表格文件的功能,debug测试可以用,但是编译打包apk就报错了结论由于Poi里大量使用到了反射,所有使用Poi导出xlsx......
  • 豆瓣评分 8.6,近 5 万读者学习的 Android 经典最新版出版,承载无数程序员的回忆......
    题图|新的小绿人 ©Google“出色向导”对新手来说,学习Android开发一开始会很难。就像初次踏入异国他乡一样,即使会说当地语言,一开始也绝不会有舒服自在的感觉。周围人习以为常的东西你不能理解,原有的知识储备在新环境下也完全派不上用场。Android有自己的语言文化——使用K......
  • 在Androidstudio 中 通过jni java 和c++相互调用实现方法
    在Androidstudio中通过jnijava和c++相互调用实现方法1.创建javanative方法类publicclassNativeAPI{privatestaticfinalStringTAG=APP_TAG+"TestJni";static{System.loadLibrary("testnative");}//从c++so中获取字符串publicna......
  • Android自定义控件
    继承现有控件类publicclassLeftButtonBarextendsLinearLayout{//默认实现的构造函数beginpublicLeftButtonBar(Contextcontext){super(context);}publicLeftButtonBar(Contextcontext,@NullableAttributeSetattrs){supe......
  • Android应用开发靠不住,还是Android系统开发香!
    背景2015-2023,我已经工作将近8年了,刚开始我是一名Android应用层开发工程师,2021年我开始转为系统工程师,向着更底层出发了,因为我想提高自己的职场竞争力,应用层开发相对简单,系统层会更有难度,更有挑战,也更不容易被市场淘汰。而且现在的Android市场,Android初级工程师早就已经严重饱和了,......
  • 面试碰壁如何力挽狂澜,有了这份Android指南你也可以有绿色通道!
    简历怎样写才能过初步筛选?大厂面试到底要求什么,关注什么?技术面试如何展示自己的实力?95%的面试者都有这些疑问,所以今天,给大家分享一些面试准备的干货:一、简历要有含金量一份漂亮的简历就是你进入大厂的敲门砖。网上有很多教程教大家如何写出一份漂亮的简历,这里我就不做重复劳动了今......
  • Android13 安装最新版 Frida
    本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Android13安装最新版Frida环境win10Pixel4Android13Python3.9Frida16.1.0Frida-tools12.1.3PC安装......