You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

横竖屏适配:竖屏用RecyclerView、横屏用TableView,求填充代码实现

Hey there! 你已经搞定了横竖屏布局切换的核心部分,真不错!接下来咱们把TableView的数据填充这个难题拆解清楚,其实思路和RecyclerView异曲同工,只是细节上有区别,我给你分情况一步步来:

解决TableView数据填充的分步方案

1. 先明确你的TableView类型

首先得区分你用的是第三方可滚动TableView库(比如带行列头、支持横向滚动的那种)还是原生TableLayout,两种的实现方式不太一样,我分别给你讲:


情况一:使用第三方TableView库(主流表格组件)

这类库通常需要三个适配器(列头、行头、单元格),和RecyclerView的适配器逻辑一致,只是需要适配表格的结构:

步骤1:准备数据模型

先为表格的不同部分定义数据类,方便后续绑定:

// Kotlin示例
// 列头数据模型
data class ColumnHeader(val title: String)
// 行头数据模型
data class RowHeader(val rowId: String)
// 单元格数据模型
data class TableCell(val content: String)
// Java示例
public class ColumnHeader {
    private String title;
    public ColumnHeader(String title) { this.title = title; }
    public String getTitle() { return title; }
}

public class RowHeader {
    private String rowId;
    public RowHeader(String rowId) { this.rowId = rowId; }
    public String getRowId() { return rowId; }
}

public class TableCell {
    private String content;
    public TableCell(String content) { this.content = content; }
    public String getContent() { return content; }
}

步骤2:创建适配器

以Kotlin为例,继承库提供的基础适配器(不同库的基类名称可能略有不同,比如BaseColumnHeaderAdapter):

列头适配器
class MyColumnHeaderAdapter(
    private val context: Context,
    private val headers: List<ColumnHeader>
) : BaseColumnHeaderAdapter<ColumnHeader>(context, headers) {

    inner class HeaderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val titleTv: TextView = itemView.findViewById(R.id.tv_column_title)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val view = LayoutInflater.from(context)
            .inflate(R.layout.item_column_header, parent, false)
        return HeaderViewHolder(view)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val header = headers[position]
        (holder as HeaderViewHolder).titleTv.text = header.title
    }
}
单元格适配器
class MyCellAdapter(
    private val context: Context,
    private val cellData: List<List<TableCell>> // 二维列表:行 -> 列
) : BaseCellAdapter<TableCell>(context, cellData.flatten()) {

    inner class CellViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val contentTv: TextView = itemView.findViewById(R.id.tv_cell_content)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val view = LayoutInflater.from(context)
            .inflate(R.layout.item_table_cell, parent, false)
        return CellViewHolder(view)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        // 根据表格的行列位置匹配数据(不同库获取行列位置的API可能略有差异)
        val rowPos = tableView.rowHeaderPosition
        val columnPos = position % cellData[rowPos].size
        val cell = cellData[rowPos][columnPos]
        (holder as CellViewHolder).contentTv.text = cell.content
    }
}

步骤3:绑定数据到TableView

在横屏对应的Activity的onCreate方法中,初始化数据并设置适配器:

// 准备测试数据
val columnHeaders = listOf(
    ColumnHeader("姓名"), ColumnHeader("年龄"), ColumnHeader("城市")
)
val rowHeaders = listOf(
    RowHeader("1"), RowHeader("2"), RowHeader("3")
)
val cellData = listOf(
    listOf(TableCell("张三"), TableCell("25"), TableCell("北京")),
    listOf(TableCell("李四"), TableCell("30"), TableCell("上海")),
    listOf(TableCell("王五"), TableCell("28"), TableCell("广州"))
)

// 获取TableView实例
val tableView = findViewById<TableView>(R.id.table_view)

// 设置适配器(行头适配器写法和列头基本一致)
tableView.columnHeaderAdapter = MyColumnHeaderAdapter(this, columnHeaders)
tableView.rowHeaderAdapter = MyRowHeaderAdapter(this, rowHeaders)
tableView.cellAdapter = MyCellAdapter(this, cellData)

// 通知数据更新
tableView.notifyDataSetChanged()

情况二:使用原生TableLayout

如果你的需求比较简单,用原生TableLayout就够了,直接动态添加行和控件就行:

val tableLayout = findViewById<TableLayout>(R.id.table_layout)

// 1. 添加表头行
val headerRow = TableRow(this).apply {
    columnHeaders.forEach { header ->
        addView(TextView(this@MainActivity).apply {
            text = header.title
            setPadding(16, 16, 16, 16)
            background = ContextCompat.getDrawable(this@MainActivity, R.drawable.table_header_bg)
            textSize = 16f
            setTextColor(Color.BLACK)
        })
    }
}
tableLayout.addView(headerRow)

// 2. 添加数据行
cellData.forEach { row ->
    val tableRow = TableRow(this).apply {
        row.forEach { cell ->
            addView(TextView(this@MainActivity).apply {
                text = cell.content
                setPadding(16, 16, 16, 16)
                background = ContextCompat.getDrawable(this@MainActivity, R.drawable.table_cell_bg)
                textSize = 14f
            })
        }
    }
    tableLayout.addView(tableRow)
}

额外小贴士

  • 如果你用的第三方库有官方示例,优先参考示例代码,不同库的适配器API可能略有差异,但核心都是数据模型+适配器绑定,和RecyclerView逻辑一致。
  • 横竖屏切换时,记得用onSaveInstanceState保存数据,避免切换后数据丢失或重复加载。
  • 测试时多切换几次横竖屏,检查表格布局和数据是否正常显示,有没有拉伸或错乱的问题。

内容的提问来源于stack exchange,提问作者Pemba Tamang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:11:01