动态表格的核心是二维数据结构,常见设计方式:
// 示例数据结构(课程表) List<List<String>> tableData = new ArrayList<>(); tableData.add(Arrays.asList("周一", "数学", "英语", "体育")); // 表头 tableData.add(Arrays.asList("8:00", "张老师", "李老师", "王教练")); tableData.add(Arrays.asList("10:00", "李老师", "王老师", ""));
数据结构类型 | 特点 | 适用场景 |
---|---|---|
List<List<Object>> |
灵活存储多类型数据 | 简单表格展示 |
自定义Bean | 可扩展字段属性 | 复杂数据结构 |
数据库游标 | 实时查询大数据 | 数据量过大的场景 |
<androidx.recyclerview.widget.RecyclerView android:id="@+id/table_rv" android:layout_width="match_parent" android:layout_height="wrap_content" app:layoutManager="GridLayoutManager" app:spanCount="4"/> <!-列数根据需求设置 -->
public class TableAdapter extends RecyclerView.Adapter<TableAdapter.ViewHolder> { private List<List<String>> data; private int columnCount; public TableAdapter(List<List<String>> data) { this.data = data; this.columnCount = data.get(0).size(); // 取第一行作为列数 } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { TextView textView = new TextView(parent.getContext()); textView.setBackgroundColor(Color.WHITE); textView.setTextColor(Color.BLACK); textView.setPadding(8, 8, 8, 8); return new ViewHolder(textView); } @Override public void onBindViewHolder(ViewHolder holder, int position) { int row = position / columnCount; int col = position % columnCount; holder.textView.setText(data.get(row).get(col)); } @Override public int getItemCount() { return data.size() columnCount; // 总单元格数 } static class ViewHolder extends RecyclerView.ViewHolder { TextView textView; public ViewHolder(View itemView) { super(itemView); this.textView = (TextView) itemView; } } }
// 新增一行数据 tableData.add(Arrays.asList("14:00", "赵老师", "刘老师", "音乐")); adapter.notifyItemRangeInserted(tableData.size()-1, columnCount);
优化方向 | 实现方式 |
---|---|
视图复用 | 使用RecyclerView自带复用机制 |
异步加载 | 结合LiveData或RxJava处理数据 |
分页加载 | 按区域加载可见单元格 |
内存优化 | Bitmap缓存复杂单元格 |
库名 | 特点 | 适用场景 |
---|---|---|
TableView | 支持合并单元格、滑动冻结 | 复杂报表场景 |
EasyTable | 轻量级表格控件 | 简单数据展示 |
AndroidPdfTable | 生成PDF格式表格 | 文件导出需求 |
// 初始化表格(Activity) RecyclerView recyclerView = findViewById(R.id.table_rv); GridLayoutManager manager = new GridLayoutManager(this, 4); // 4列 recyclerView.setLayoutManager(manager); TableAdapter adapter = new TableAdapter(tableData); recyclerView.setAdapter(adapter);
A:需使用SpannedGridLayoutManager
或第三方库,通过设置冻结行参数实现。
SpannedGridLayoutManager manager = new SpannedGridLayoutManager(this, 4); manager.setHeaderRow(0); // 固定第一行 recyclerView.setLayoutManager(manager);
A:需在适配器增加跨行跨列逻辑:
onBindViewHolder
判断是否需要合并// 示例:合并第一行前两列 if(position == 0) { ViewHolder holder = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(1); holder.textView.setVisibility(View.GONE); // 隐藏被合并单元格 }