Pergunta

Eu tenho um componente DataGrid que eu gostaria de atualizar a cada 5 segundos. Como linhas estão sendo adicionados a esta DataGrid notei que cada atualização faz com que ele para redefinir a posição da barra de rolagem até o topo. Como posso gerir a manter a barra de rolagem na sua posição anterior?

Foi útil?

Solução 2

Eu escrevi uma pequena classe de extensão para DataGrid baseado em este artigo . Parece ótimo trabalho.

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;
        }
}   

Outras dicas

fazer uma variável para armazenar a sua última posição de rolagem e usar isso.

aproximadamente algo como:

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;
}

Não é o melhor código, mas ilustra o ponto, sempre que alguém termina o evento de rolagem, você armazenar última posição em uma variável e você usá-lo para restaurar o direito posição de rolagem depois que você adicionou novos dados.

Eu não testei este código, mas ele deve funcionar:

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top