我正在使用数据网格和异步数据提供程序来显示存储在数据库中的很长一段数据。为避免不断从数据库请求数据,正在使用缓存。此缓存仅包含部分实际数据,因此数据将在需要时加载。
假设datagrid包含所有实际数据而不必全部呈现,则创建了一个新的窗口小部件并将其合并到显示数据网格的视图中。
此小部件模拟垂直滚动条,允许用户浏览所有数据,甚至是当前不在缓存中的数据。因此,datagrid始终具有相同的行数,并且所有行都可见。而缓存包含可见行以及可见数据之前和之后的最近数据。
因此,当滚动条移动到不在缓存中的位置时,对数据库的请求就完成了,并且文本“加载...”'显示为数据网格具有的加载指示符的一部分。但是当发生这种情况时,如果数据网格宽度大于屏幕宽度,则会显示数据网格包含的水平滚动,一旦我收回数据并显示,我就会失去水平滚动条的位置。
因此,在将数据加载到缓存后,水平滚动条始终位于开头。我试图在显示“加载...”之前存储水平滚动条的位置。然后恢复它,但由于可以继续进行多次调用,在按住滚动条时检测到鼠标移动的次数,我无法判断我何时存储初始位置或显示“加载”的位置。 ..'
在加载新数据之前,有什么想法可以阻止滚动条改变其位置或如何恢复它的位置?
答案 0 :(得分:1)
我做了什么,对我来说效果很好; - ),
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.client.ui.CustomScrollPanel;
import com.google.gwt.user.client.ui.HeaderPanel;
public class MyDataGrid<T> extends DataGrid<T> {
private int scrollBarPositionV;
private int scrollBarPositionH;
public void saveScrollBarPosition() {
final HeaderPanel panel = (HeaderPanel) getWidget();
final CustomScrollPanel bodyContent = (CustomScrollPanel) panel.getContentWidget();
scrollBarPositionH = bodyContent.getHorizontalScrollPosition();
scrollBarPositionV = bodyContent.getVerticalScrollPosition();
}
public void restoreScrollBarPosition() {
final HeaderPanel panel = (HeaderPanel) getWidget();
final CustomScrollPanel bodyContent = (CustomScrollPanel) panel.getContentWidget();
bodyContent.setHorizontalScrollPosition(scrollBarPositionH);
bodyContent.setVerticalScrollPosition(scrollBarPositionV);
}
}
答案 1 :(得分:0)
DataGrid不提供api来捕获水平滚动条位置。
GWT中的ScrollPanel,它提供api来捕获水平和垂直滚动位置。
尝试此解决方法
1)将数据网格添加到滚动面板
2)在调用对数据库的请求之前捕获水平滚动位置以检索记录。使用方法getHorizontalScrollPosition()
3)成功完成DB请求后,将记录加载到相应的对象(datagrid)
中4)使用setHorizontalScrollPosition()
重置滚动面板水平位置希望它能帮助!!