0

我有一个带有变量 row_height 的火花列表(2 个自定义 itemRenderer:标题 30 像素,联系人 60 像素),在滚动后唯一的第一个方向更改时,更改视图中的索引。

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

我没有在任何地方设置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:

我认为唯一要做的就是在 Scroller 的类中到处放置断点。

编辑4:

仅当滚动到列表底部时才会出现此问题。

编辑 5:

发现问题!VerticalLayout.as,在 updateDisplayListVirtual(row 1797) 中调用了一个方法 (updateLLV),该方法使用典型的LayoutElement 设置了 LinearLayoutVector。这是延迟初始化,第一个 itemRenderer 添加到列表的 dataGroup 中。就我而言,它是 HeaderItemRenderer (30px)。

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

问题是没有考虑变量RowHeight!

4

1 回答 1

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;
        });
}
于 2013-10-03T13:59:46.693 回答