【发布时间】:2012-02-20 23:32:25
【问题描述】:
我需要显示一个几乎无限滚动的交互式小部件列表,并在添加新数据或用户滚动到未缓存区域时根据需要添加/删除它们。
TreeView (as asked about here) 不是选项,因为我需要完整的小部件作为项目(由具有多个操作等的标准小部件组成,但 CellRenderer 不适合此)
更糟糕的是,我事先不知道小部件的高度(虽然变化不大),所以使用 VBox 可能会导致跳跃。
使用滚动条应该仍然感觉好像列表是有限的(即仅在滚动完成后更新,因此滚动按钮不会从您的鼠标上跳开),并且在调整窗口大小和更新窗口布局时,滚动位置不应该改变太多(焦点小部件应该保持在原来的位置,除非当然焦点小部件被滚动了......)。
最好的方法是什么?甚至当需要添加新的小部件时,它甚至可能只是向我发送信号的库?
或者可以强制 ListView 以不太讨厌的方式执行此操作? (即在屏幕外缓冲区上绘制,使用 CellRenderer 将其复制到单元格中,将鼠标/键盘事件中继到实际小部件?)
【问题讨论】:
-
“跳跃”是什么意思? VBox 有什么问题?
-
如果用户向上滚动,则小部件的平均高度为 200 像素(即,我有许多 200 像素高的空白单元格,我视需要替换为实际的小部件),但我添加了一个 250 像素的单元格在顶部,一切看起来都会向下跳 50px。所以我猜 VBox 必须放置在 Fixed 中并向上移动 50px 以防止这种情况发生,但是它不会再被拉伸到 ScrollWindow 的大小......
-
您可以尝试手动滚动到当前小部件。
-
是的,但我认为这会与用户交互发生冲突:当滚动条被抓住并向上推动时(因此必须添加新的小部件),如果它突然跳下会感觉很奇怪。所以我必须移动小部件的容器。或者创建一个可以具有隐藏偏移的调整适配器。也许根本不使用滚动条,而是像 Google Wave 那样使用慢速拨盘? (已经有一个很好的小部件了吗?)
-
如果您只想将列表扩展到底部,那么您可以在用户停止滚动足够接近底部时添加新的小部件。要求非常复杂:当用户向下拖动滚动条时,您不希望滚动条跳动,但如果用户按住滚动条等待数据加载,它应该加载。如果您要在顶部和底部添加数据,我认为滚动条效果不佳。也许列表上方和下方的程式化箭头? (确保在任何一种情况下都处理鼠标滚轮事件)