前言

最近遇到一个需求,以表格的形式模拟样本盒的显示,最初设想是利用RecyclerView网格形式实现,然而需求是盒子行列数目不固定,可能存在手机屏幕一屏显示不下的情况,因此需要做成可以上下左右滑动的表格。具体效果图如下:

思路

采用RecyclerView+HorizontalScrollView嵌套的方式实现。左上角空白区域预留,可以用于显示行列的标题,左边Row列表是RecyclerView用于显示行标题,Row列表右边为HorizontalScrollView,内部是两个RecyclerView,分别用户显示列标题和具体的数据。

实现

布局代码如下:

<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"></FrameLayout><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView_l"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_below="@+id/title"app:layoutManager="android.support.v7.widget.LinearLayoutManager"tools:listitem="@layout/item_text_grid" /><HorizontalScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_toEndOf="@id/recyclerView_l"android:layout_toRightOf="@id/recyclerView_l"android:fillViewport="true"android:overScrollMode="never"android:scrollbars="none"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="vertical"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView_t"android:layout_width="match_parent"android:layout_height="wrap_content"android:overScrollMode="never"app:layoutManager="android.support.v7.widget.GridLayoutManager"app:spanCount="9"tools:listitem="@layout/item_text_grid" /><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView_r"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never"app:layoutManager="android.support.v7.widget.GridLayoutManager"app:spanCount="9"tools:listitem="@layout/item_text_grid" /></LinearLayout></HorizontalScrollView></RelativeLayout>

其中title布局为左上角空白区域,recyclerView_l为Row标题列表,recyclerView_t为列标题列表,recyclerView_r为内容区域。Row列表使用LinearLayoutManager,头部列表和内容列表需要保持一致,

注意这两个属性:

app:layoutManager="android.support.v7.widget.GridLayoutManager"
app:spanCount="9"

显示的行列数,可以根据具体的业务场景在代码中进行设置。

分别对3个RecyclerView绑定数据后,可以看到基本结构已经出现,但是还会存在一些问题,如内容上下滑动的时候,Row列表没有产生联动,而我们的预期是内容区域的上下左右滑动,行标题及列标题会与内容区域一起移动,因此这里需要建立滑动关联。

建立关联的关键点就是监听recyclerView的滑动事件,代码如下:

recyclerViewLeft.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);if (recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {recyclerViewRight.scrollBy(dx, dy);}}});recyclerViewRight.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);if (recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {recyclerViewLeft.scrollBy(dx, dy);}}});

此时再次运行,即可达到想要的效果。

Activity 详细代码:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.widget.RelativeLayout;import com.code.common.adapter.BaseRecyclerAdapter;
import com.code.common.adapter.BaseRecyclerViewHolder;
import com.tono.biobank.BaseActivity;
import com.tono.biobank.R;import java.util.ArrayList;
import java.util.List;/*** 扫描盒子结果页面** @author yinbiao* @date 2018/11/22*/
public class ScanBoxResultActivity extends BaseActivity {private RecyclerView recyclerViewLeft;private RecyclerView recyclerViewRight;private RecyclerView recyclerViewTop;private List<String> left = new ArrayList<>();private List<String> right = new ArrayList<>();private List<String> top = new ArrayList<>();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_scanbox_result);initView();}private void initView() {recyclerViewLeft = findViewById(R.id.recyclerView_l);recyclerViewRight = findViewById(R.id.recyclerView_r);recyclerViewTop = findViewById(R.id.recyclerView_t);for (int i = 0; i < 50; i++) {left.add("row" + (i + 1));}findViewById(R.id.title).post(new Runnable() {@Overridepublic void run() {RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);lp.width = recyclerViewLeft.getWidth();lp.height = recyclerViewTop.getHeight();findViewById(R.id.title).setLayoutParams(lp);}});for (int i = 0; i < 9; i++) {top.add("第" + (i + 1) + "列");}for (int i = 0; i < 450; i++) {right.add("item" + (i + 1));}recyclerViewLeft.setAdapter(new BaseRecyclerAdapter<String>(this, left, R.layout.item_text_grid) {@Overrideprotected void convert(BaseRecyclerViewHolder holder, String s, int position) {holder.setText(R.id.tv, s);}});recyclerViewRight.setAdapter(new BaseRecyclerAdapter<String>(this, right, R.layout.item_text_grid) {@Overrideprotected void convert(BaseRecyclerViewHolder holder, String s, int position) {holder.setText(R.id.tv, s);}});recyclerViewTop.setAdapter(new BaseRecyclerAdapter<String>(this, top, R.layout.item_text_grid) {@Overrideprotected void convert(BaseRecyclerViewHolder holder, String s, int position) {holder.setText(R.id.tv, s);}});recyclerViewLeft.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);if (recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {recyclerViewRight.scrollBy(dx, dy);}}});recyclerViewRight.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);if (recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {recyclerViewLeft.scrollBy(dx, dy);}}});}
}

其中适配器就是RecyclerView的适配器,自行实现即可。由于时间有限,未对其进行封装优化,仅留作记录,并提供思路给大家。

参考

https://github.com/Kelin-Hong/ScrollablePanel

https://github.com/MartinDong/ScrollingTable

Android 可滑动表格的简单实现(类似于excel表格,支持上下左右滑动)相关推荐

  1. 办公软件excel表格_钢筋算量Excel表格,现场算钢筋,效率可与大型软件相比

    提起钢筋算量,工作很久造价和施工恐怕都要挠头,对于刚入行的造价和施工都可以说是灾难.不过不用担心,我今天就是来给大家送解决方法--钢筋算量Excel表格. 钢筋算量Excel表格基本包含了钢筋算量的全 ...

  2. 如何制作一张自动汇总表格,搞定所有Excel表格数据汇总问题

    Excel表格数据汇总问题,一直困扰大家:为什么Excel没有表格数据自动汇总功能?大家要么手工复制粘贴汇总[容易遗漏],要么装一个第三方插件自动汇总[担心安全],当然直接使用ExcelVBA编程也可 ...

  3. html5怎么导出表格,《网页 导出到 excel表格数据》 如何将网页表格导出到excel

    如何将网页数据输出为Excel或Word文件 1.保页 在浏览器中访标网页,执行菜单"文件"→"另",文件类型"网页,全部". 2.用WPS ...

  4. 如何将excel表格导入word_PPT怎样导入Excel表格?PPT导入Excel表格方法

    PPT一直是我们最常使用的演示文稿,而Excel又是我们在办法中最常使用的表格软件,当我们想要在演示PPT中添加表格时,可以将Excel表格完成之后再导入到PPT演示,这样会使PPT看起来非常美观,那 ...

  5. 手机怎么解开excel表格xlsx加密文件,excel表格xlsx权限限制如何解除?

    excel表格xlsx在线解开,excel表格xlsx有密码怎么解开?excel表格xlsx解密助手,安利「密码帝」 无需下载安装软件,百度搜索密码帝就可以了,手机电脑都可以,一键轻松在线解密!

  6. jq获取表格里的checkbox_Python读写Excel表格,就是这么简单粗暴又好用

    最近在做一些数据处理和计算的工作,因为数据是以.CSV格式保存的,因此刚开始直接用Excel来处理. 但是做着做着发现重复的劳动,其实并没有多大的意义,于是就想着写个小工具帮着处理. 以前正好在一本书 ...

  7. php导入excel表格数据,php页面导入excel表格数据-php导入excel 怎么获取excel表格数据...

    PHP如何导出当前页面中的表格至Excel 常用的用PHP读取EXCEL的方法有以下三种,各自有各自的优缺点.个人推荐用第三种方法,因为它可以跨平台使用. 1. 以.csv格式读取 将.xls转换成. ...

  8. c语言读取excel表格_利用pandas处理excel表格

    这不是一篇详细介绍pandas的文章,只是我在利用python处理excel表格时找到的一些临时方案,为了避免忘记,记录在这里,也可能对你有帮助. pandas在对excel处理上使用的是xlrd和x ...

  9. 用python或者vba把一个excel表格拆分成多个excel表格

    工作中有时候会碰到需要把一张大的表格(行数多)分拆成多个表格的情况,虽然不太符合常理,如果一张表格太大,数据导出的时候就应该拆好,但实际上基于各种原因还是会碰到. python脚本,比较简单也比较好理 ...

最新文章

  1. Matlab2012a下配置LibSVM—3.18
  2. CV多任务学习笔记 yolop
  3. 超强、超详细Redis入门教程【转】
  4. php替换文件中的数据库,批量替换php文件中的class,id的值
  5. mysql maxconnections 最大值,MySQL性能优化之max_connections配置参数浅析
  6. 怎么用java ee编程_Java EE应用程序入门 - 编程入门网
  7. 《2021国庆出行报告》出炉:全国高速拥堵里程占比同比下降37%
  8. MiniProfiler使用点滴记录-2017年6月23日11:08:23
  9. 【python6】快递分拣小程序
  10. 我收集了12款自动生成器,无聊人士自娱自乐专用
  11. python生成图像公章_仿真印章制作——三种方法
  12. 2019年,个人年终总结
  13. 股市中如何用筹码分布选牛股,通达信幅图指标公式筹码寻牛
  14. (2022-2028年年)全球与中国实验室开发试验(LDT)行业发展调研与市场前景预测报告
  15. 2019.2.13 【过年停更了很久,挖个坑】
  16. linux(四) -- 常用基本命令
  17. 【javascript】实现模板生成大量数据
  18. 一分钟了解“英语表示区分”
  19. 禁止多人使用同一账号在系统上进行操作[踢人操作]
  20. 如何将日语在线翻译成中文

热门文章

  1. 【JAVA基础】初学者指南--两万字知识点总结--零基础,超详细 。
  2. ajax 手机端滑动分页
  3. Redis基础数据结构String:你知道String长度限制多少吗
  4. python中的repr_repr,python中的repr
  5. 推荐系统中的召回算法大致梳理(非完整)
  6. 汽车检测站计算机网络系统,汽车综合性能检测站计算机管理系统的功能实现格和应用分析...
  7. keytool 查看apk 签名信息
  8. mysql查各分数段人数_mySql 分段查询
  9. goproxy编译、安装与配置
  10. 【CSS】CSS 背景设置 ⑤ ( 盒子中图片对齐操作 )