是否可以在列表顶部放置特定元素?
backgoround: 我有一个活动应用程序,不断添加新事件。事件按日期排序。如果事件通过,它仍然在页面顶部。现在一段时间过去了,第一个元素全部结束,因此第一个分页不再显示任何necassery数据。要获得将要发生的事件,用户必须单击寻呼机按钮。 我希望这些事件显示在顶部,如果用户想要查看以前的事件,他必须单击寻呼机的后退按钮。
我尝试了什么:
cellTable.setVisibleRange(overElements, (overElements + totalEementCount));
这混合了整个寻呼机逻辑,用户无法再从寻呼机切换到页面。
SingleSelectionModel<JSEvents> selectionModel = new SingleSelectionModel<JSEvents>();
...
selectionModel.setSelected(nextEvent, true);
这会选择正确的元素,并将寻呼机移动到它,但其他元素仍然可见,所以如果我有一些“结束”事件,而在最坏的情况下,只有一个“通过”事件表。此外,可用性也很糟糕,因为用户必须查看下一个事件并且没有它在页面顶部...
答案 0 :(得分:1)
如果您使用的是ListDataProvider
,则可以将新事件添加到列表的前面。将通知所有取决于该数据提供者的内容并重绘。
如果您使用的是其他类型的数据提供者,则可能需要自己致电CellTable.redraw
,但我认为AbstractDataProvider
会为您解决此问题。
作为第一个调查步骤,您可能只是在记录新事件后尝试调用cellTable.redraw()
以查看是否可以将您带到任何地方。
答案 1 :(得分:0)
找到了解决方案:
celltable有一个方法setVisibleRange
。当涉及寻呼机时,此方法用于示例中:
int start = display.getVisibleRange().getStart();
int end = start + display.getVisibleRange().getLength();
end = end >= data.size() ? data.size() : end;
List<JSEvents> sub = data.subList(start, end);
updateRowData(start, sub);
updateRowData告诉celltable,显示哪些数据以及此数据从哪个位置开始。
现在,如果我们想在页面顶部有一个特定元素,我们可以使用相同的函数。这就是我最终使用它的方式:
int end = start + PAGESIZE;
end = (end >= data.size()) ? data.size() : end;
List<JSEvents> sub = data.subList(start, end);
dataProvider.updateRowData(start, sub);
cellTable.setVisibleRange(start, sub.size());