横竖屏适配:竖屏用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
相关产品推荐
相关产品推荐

