我有一个DataGrid组件,我想每5秒更新。 作为行被添加到这个DataGrid中我注意到,每一次更新使其复位滚动条位置更靠近顶部。 我如何设法保持滚动条在其前面的位置?
Answer 1:
做一个变量来存储你的最后滚动位置并使用它。
大致是这样的:
var lastScroll:Number = 0;
private function creationCompleteHandler(event:FlexEvent):void{
stage.addEventListener(MouseEvent.MOUSE_UP, updateLastScroll);
}
private function updateLastScroll(event:MouseEvent):void{
lastScroll = myDataGrid.verticalScrollPosition
}
private function dataGridHandler(event:Event):void{
myDataGrid.verticalScrollPosition = lastScroll;
}
这是不是最好的代码,但它说明了这一点,只要有人完成了滚动事件,您最后一个位置保存在一个变量,你用它来恢复你已经添加了新的数据后,右边的滚动位置。
Answer 2:
我写了一个小的扩展类DataGrid
基于这篇文章 。 它似乎工作的伟大。
public final class DataGridEx extends DataGrid
{
public var maintainScrollAfterDataBind:Boolean = true;
public function DataGridEx()
{
super();
}
override public function set dataProvider(value:Object):void {
var lastVerticalScrollPosition:int = this.verticalScrollPosition;
var lastHorizontalScrollPosition:int = this.horizontalScrollPosition;
super.dataProvider = value;
if(maintainScrollAfterDataBind) {
this.verticalScrollPosition = lastVerticalScrollPosition;
this.horizontalScrollPosition = lastHorizontalScrollPosition;
}
}
Answer 3:
我还没有测试此代码,但它应该工作:
var r:IListItemRenderer;
var len:Number = dataGrid.dataProvider.length;
var i:Number;
//indexToItemRenderer returns null for items that are not visible
for(i = 0; i < len; i++)
{
r = dataGrid.indexToItemRenderer(i);
if(r)
break;
}
//now i contains the first visible item - store this in a variable
lastPos = i;
//update the dataprovider here.
//now scroll to the position
dataGrid.scrollToIndex(lastPos);
Answer 4:
这些可能会有所帮助:
保持异步回后滚动位置
保持在回发滚动位置 (滚动进一步向下阅读本)
文章来源: How to data bind DataGrid component without scrolling up?