未调用setRowHeadItems时使用evrencoskun的TableView隐藏行崩溃
问题:evrencoskun TableView隐藏行时因未设置RowHeadItems崩溃
场景与现象
- 使用evrencoskun的TableView组件隐藏某一行,因表格无需行标签,未调用
setRowHeadItems方法 - 触发
hideRow时应用直接崩溃,抛出IndexOutOfBoundsException - 已确认崩溃前表格已加载包含目标行在内的完整数据
崩溃栈信息
FATAL EXCEPTION: main Process: com.example.app, PID: 20150 java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) at java.util.Objects.checkIndex(Objects.java:359) at java.util.ArrayList.remove(ArrayList.java:511) at com.evrencoskun.tableview.adapter.recyclerview.AbstractRecyclerViewAdapter.deleteItem(AbstractRecyclerViewAdapter.java:99) at com.evrencoskun.tableview.adapter.AbstractTableAdapter.removeRow(AbstractTableAdapter.java:244) at com.evrencoskun.tableview.handler.VisibilityHandler.hideRow(VisibilityHandler.java:63) at com.evrencoskun.tableview.TableView.hideRow(TableView.java:618) ...
原因分析
TableView的hideRow方法内部会同步更新数据行、列头和行头三个数据集。如果未初始化行头集合(未调用setRowHeadItems),对应的集合为空,当框架尝试删除对应索引的行头元素时,就会触发数组越界异常。
解决方案
方案1:初始化空行头集合(推荐)
在加载表格数据时,即使不需要显示行头,也要调用setRowHeadItems传入一个与数据行数量匹配的空集合,示例代码:
// rowCount为表格数据的总行数 List<Object> emptyRowHeads = new ArrayList<>(Collections.nCopies(rowCount, null)); tableView.setRowHeadItems(emptyRowHeads);
这样框架操作行头集合时不会因为索引不存在崩溃,同时由于行头内容为null,自定义的RowHeaderViewHolder可以处理成不显示内容的布局。
方案2:重写适配器方法(进阶)
如果不想初始化空集合,可以重写AbstractTableAdapter中的removeRow方法,跳过行头集合的操作逻辑,示例:
@Override public void removeRow(int position) { // 只操作数据行集合,跳过行头操作 getCellItems().remove(position); notifyDataSetChanged(); }
注意:此方法可能会影响TableView的其他联动逻辑,需自行测试验证。
内容的提问来源于stack exchange,提问作者incarnadine
相关产品推荐
相关产品推荐

