You need to enable JavaScript to run this app. 使用evrencoskun/TableView库时水平滚动破坏表格布局问题求助
优惠活动
大模型
产品
解决方案
定价
更多

使用evrencoskun/TableView库时水平滚动破坏表格布局问题求助

问题描述

我使用如下TableView库为我的应用数据创建表格:
https://github.com/evrencoskun/TableView
该库实用性较强,但当表格数据超出屏幕尺寸、即行数超过屏幕可显示范围时,水平滚动功能会出现异常。
当存在未在屏幕上展示的数据行时,我执行水平滚动操作查看右侧列,这些动态数据行不会同步滚动,进而导致表格布局错乱。
请查看下方截图以便清晰了解具体问题:
初始界面
水平滚动后的第二张截图
水平滚动后再垂直滚动、布局错乱的第三张截图
我已经下载了该GitHub仓库提供的示例应用,运行状态完全正常,但我暂未找到自有项目出现布局错乱问题的根本原因。
若能提供相关帮助或指导,我将不胜感激。

解决方案

根因说明

该问题由RecyclerView复用机制与TableView横向滚动状态未同步导致:横向滚动后新滑入屏幕的行ViewHolder复用了旧的item实例,未主动对齐当前全局的横向滚动偏移量,最终出现行错位。

修复步骤

  1. 全局记录横向滚动偏移量
    初始化TableView时添加滚动监听,保存实时横向滚动位置:
// 全局变量存储当前横向滚动偏移
private var currentHorizontalScrollX = 0

tableView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)
        if (dx != 0) {
            currentHorizontalScrollX = tableView.horizontalScrollOffset
        }
    }
})
  1. 绑定单元格时同步滚动位置
    在Adapter的onBindCellViewHolder方法中,每次绑定数据都强制对齐当前滚动偏移:
override fun onBindCellViewHolder(holder: CellViewHolder, columnPosition: Int, rowPosition: Int) {
    // 原有数据绑定逻辑
    // 新增同步横向滚动位置逻辑
    holder.cellContentContainer.scrollTo(currentHorizontalScrollX, 0)
}
  1. 处理ViewHolder复用逻辑
    重写Adapter的onViewRecycled方法,复用前清理旧的滚动状态:
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
    super.onViewRecycled(holder)
    if (holder is CellViewHolder) {
        holder.cellContentContainer.scrollTo(0, 0)
    }
}

额外校验项

  • 所有列宽度为固定值,未动态修改列宽
  • 单元格内部未添加额外可横向滚动控件,避免滚动事件冲突
  • 未关闭TableView的isHorizontalScrollEnabled配置

内容的提问来源于stack exchange,提问作者Saurabh Shetty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 06:18:02