2013-10-01 46 views
0

我有一个变量row_height(2自定义itemRenderer:头30像素,接触60像素)的火花表,在滚动后唯一的第一个方向变化,改变索引在视图中。Flex:Spark List在视图中的取向变化在方向变化上的变化

我试图将Header设置为60像素高度,并且我对方向更改没有任何问题。

我没有在任何地方设置verticalScrollPosition。在视口列表中添加事件侦听器并观看verticalScrollPosition,它在方向更改时不会更改。

我真的不知道我该如何解决这个问题。

编辑: 这是相对的代码清单:

<fx:Script> 
protected function creationCompleteHandler(event:FlexEvent):void 
{ 
    addressBookViewModel = ViewModelFactory.getInstance().getAddressBookViewModel(); 
    addressBookViewModel.getUserContacts(onDataReceived); 
} 

protected function pagedContactsList_initializeHandler(event:FlexEvent):void 
{ 
    asyncListView.list = pagedContactsList; 
} 

private function onDataReceived():void 
{ 
    pagedContactsList.length = (BusinessContext.getInstance().getTotalContacts() + BusinessContext.getInstance().getTotalLastNames()); 
    loadPagedData(); 
} 

private function createPendingItemFunctionHandler(index:int, ipe:ItemPendingError):Object 
{ 
    if(!addressBookViewModel.pageUp) 
    { 
     addressBookViewModel.pageUp = true; 
     addressBookViewModel.currentPage++;      
     addressBookViewModel.getMoreUserContacts(onMoreDataRecieved, onMoreDataMissing); 
    } 
    return loadingDataHeader; 
} 

private function onMoreDataRecieved():void 
{ 
    loadPagedData(); 
} 

private function loadPagedData():void 
{ 
    for(var i:int = 0; i < addressBookViewModel.contacts.length; i++) 
    { 
     pagedContactsList.setItemAt(addressBookViewModel.contacts.getItemAt(i), pagedContactsList.lastItemInsertedIndex); 
     pagedContactsList.lastItemInsertedIndex++; 
    } 
    addressBookViewModel.pageUp = false; 
} 

internal var headerItemRender:ClassFactory = new ClassFactory(HeaderItemRenderer); 
internal var contactItemRenderer:ClassFactory = new ClassFactory(ContactItemRenderer); 

private function rendererFunction(item:Object):ClassFactory 
{ 
    return item.hasOwnProperty("isHeader") ? headerItemRender : contactItemRenderer; 
} 

</fx:Script> 

<fx:Declarations> 
    <custom:PagedArrayList id="pagedContactsList" initialize="pagedContactsList_initializeHandler(event)"/> 
</fx:Declarations> 

<s:List id="list" width="100%" 
     height="100%" itemRendererFunction="rendererFunction" change="list1_changeHandler(event)"> 
    <s:AsyncListView id="asyncListView" createPendingItemFunction="createPendingItemFunctionHandler" /> 
</s:List> 

好奇的是,前后方向更改后的list.scroller.viewport.verticalScrollPosition具有相同的值,即使名单已经滚动〜40行。 (40是页面大小)。

我的应用程序中有很多列表,并且每个具有const row_height的列表都没有问题,但带有变量row_height的2有这个问题。也许这是由AsyncListView引起的。

编辑2:

我删除了AsyncListView,直接结合addressBookViewModel.contacts到List.dataProvider被,除去分页和问题仍然存在。

编辑3:

我认为,唯一可以做的事情是把断点到处都在滚轮的类。

编辑4:

这个问题滚动到列表的底部的时候才会发生。

编辑5:

找到问题! VerticalLayout.as,在updateDisplayListVirtual(行1797)中,存在对使用typicalLayoutElement设置LinearLayoutVector的方法(updateLLV)的调用。这是懒惰的初始化,第一个itemRenderer添加到列表的dataGroup中。在我的情况下,它是HeaderItemRenderer(30px)。

在updateLLV之后,通过调用LinearLayoutVector上的indexOf并传递verticalScrollPosition来设置startIndex(第一个可见项的索引)。 (简要地:verticalScrollPosition/typicalLayoutElement.height)

问题是无处不在考虑变量RowHeight!

+0

我从来没有在我们的任何移动应用中发现过这个问题。它是否在一个简单的测试案例中进行(您可以发布)? – drkstr1

+0

我已经添加了相对于列表的代码。 – Christopher

回答

0

找到了解决方法!不那么优雅,但它的作品。

stage.eventListener(StageOrientationEvent.ORIENTATION_CHANGING, yourReorientHandler, false, 1) 

设置优先级非常重要,否则updateDisplayListVirtual将在处理程序之前调用。

private function reorientHandler(event:StageOrientationEvent):void 
{ 
    var IndecesInView:Vector.<int> = list.dataGroup.getItemIndicesInView(); 
    var firstInView:int = IndecesInView[0]; 
    callLater(
     function():void 
     { 
      if(!list.layout.getScrollPositionDeltaToElement(firstInView+1)) return; 
      list.scroller.viewport.verticalScrollPosition += list.layout.getScrollPositionDeltaToElement(firstInView+1).y; 
     }); 
}