2013-10-01 87 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; 
     }); 
}