I was working with the AS3Flobile component ScrollList (its a great framework when doing mobile flash-development) and had the need to modify the dataProvider (I was making a continuous scroller), but everytime I changed the dataProvider the scroller would reset the scroll-position to x = 0, y = 0. After a little tinkering, I came up with a quick and dirty way to force the ScrollList to move to a position without a animation, and by doing so, making sure that the scroller starts at the same position as where we left off.

Of course, if anyone has a better solution, just post a comment at the end of this post!

Here it goes.

1. First we need to extend the BaseScrollViewportStrategy class. This could look something like this:

package se.marteinn.app.controls.viewport.context
{
	import com.custardbelly.as3flobile.controls.viewport.context.BaseScrollViewportStrategy;
	import com.custardbelly.as3flobile.controls.viewport.context.IScrollViewportStrategy;
	
	import flash.geom.Point;
	
	public class CustomScrollViewportStrategy extends BaseScrollViewportStrategy implements IScrollViewportStrategy
	{
		public function moveToStaticPoint( point:Point ):void
		{
			_currentScrollPositionX = point.x;
			_currentScrollPositionY = point.y;
			
			_coordinate.x = _currentScrollPositionX;
			_coordinate.y = _currentScrollPositionY;
		}
	}
}

2. Then we need to extend ScrollList and add this method: moveToStaticPoint and then override getDefaultScrollContext.

// This method sets a new scrolling position on both the ScollList itself and the strategy instance.
public function moveToStaticPoint ( point:Point ) : void
{
	var strategy:CustomScrollViewportStrategy;			
	strategy = _scrollContext.strategy as CustomScrollViewportStrategy;
		
	_currentScrollPosition = point;
	strategy.moveToStaticPoint( point );
	_listHolder.x = point.x;
	_listHolder.y = point.y;
}

// And this method makes sure that we implement the new strategy element.
override protected function getDefaultScrollContext():IScrollViewportContext
{
	return new ScrollViewportMouseContext( new CustomScrollViewportStrategy() );
}
3. After that. You can use ScrollList like this.

var scrollList:MyScrollList;

// Dump the scrollPosition (clone() is important). We will use this position after the dataProvider has changed
position = scrollList.scrollPosition.clone();

// Do your stuff. for instance alter the dataProvider of the scroll list
// scrollList.dataProvider = updatedContent;

// Finish it off by running the moveToStaticPoint method. The ScrollList will now be set at the same position as where we started.
scrollList.moveToStaticPoint( position );