NatTable如何对config labels进行排序?有没有简单方法获取相对坐标
问题根因
NatTable的视图坐标(界面显示的行/列序号)和底层数据存储坐标完全解耦,排序、过滤、分页操作只会改变视图坐标和数据坐标的映射关系,不会修改底层数据的存储顺序。你之前基于视图绝对坐标分配ConfigLabel的方案,天然不支持数据变动类操作。
解决方案:绑定数据维度的标识而非视图坐标
不需要所谓的「相对坐标」绑定,更合理的方案是让ConfigLabel和对应单元格的业务数据/底层数据索引绑定,有两种常用实现方式:
- 方案一:通过
IConfigLabelAccumulator动态计算标签
自定义实现IConfigLabelAccumulator接口,在accumulateConfigLabels方法里直接获取当前单元格对应的数据行,基于数据的业务属性判断需要添加的标签,完全不依赖视图坐标。示例代码片段:
实现完成后把累加器注册到BodyLayerStack的DataLayer即可:public class CustomCellLabelAccumulator implements IConfigLabelAccumulator { @Override public void accumulateConfigLabels(LabelStack configLabels, int columnPosition, int rowPosition) { // 获取当前视图位置对应的数据对象,不受排序影响 Object rowObj = bodyLayerStack.getBodyDataProvider().getDataValue(0, rowPosition); if (rowObj instanceof YourDataBean) { YourDataBean data = (YourDataBean) rowObj; // 按业务属性匹配标签,比如状态异常的行加红色标识标签 if (data.getStatus() == Status.ERROR) { configLabels.add("ERROR_CELL_LABEL"); } } } }bodyLayerStack.getDataLayer().setConfigLabelAccumulator(new CustomCellLabelAccumulator()); - 方案二:需要固定原始数据位置的标签时,用底层数据索引判断
如果你的需求是给原始数据列表中固定位置的单元格加颜色,不管排序后它显示在视图的哪个位置,可以在累加器里先把视图位置转成底层数据索引再做判断:// 视图位置转底层数据索引,索引值对应原始数据的存储位置,不受排序影响 int dataRowIndex = bodyLayerStack.getBodyDataLayer().getRowIndexByPosition(rowPosition); int dataColumnIndex = bodyLayerStack.getBodyDataLayer().getColumnIndexByPosition(columnPosition); // 给原始数据第3行第2列的单元格加自定义标签 if (dataRowIndex == 2 && dataColumnIndex == 1) { configLabels.add("FIXED_DATA_CELL_LABEL"); }
样式注册说明
后续照常把自定义样式和对应的ConfigLabel绑定即可,标签会在渲染时动态计算,不管触发排序、过滤还是分页操作,都会根据当前单元格对应的数据自动匹配正确的标签,不会出现颜色错位问题。
内容的提问来源于stack exchange,提问作者dammuck
相关产品推荐
相关产品推荐

