0

私は変数row_height(2つのカスタムitemRenderer:Header 30 px、Contact 60 px)を持つスパークリストを持っています。これは、スクロール後の最初の方向の変更のみで、ビューのインデックスを変更します。

ヘッダーの高さを 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>

興味深いのは、向きの変更の前後で、リストが最大 40 行スクロールした場合でも、list.scroller.viewport.verticalScrollPosition の値が同じになることです。(40 はページ サイズです)。

私のアプリには多くのリストがあり、const row_height を持つすべてのリストには問題はありませんが、変数 row_height を持つ 2 つにはこの問題があります。たぶん、AsyncListView が原因です。

編集2:

AsyncListView を削除し、addressBookViewModel.contacts を list.dataProvider に直接バインドし、ページネーションを削除しましたが、問題はまだ残っています。

編集3:

Scroller のクラスのいたるところにブレークポイントを配置するしかないと思います。

編集4:

この問題は、リストの一番下までスクロールした場合にのみ発生します。

編集5:

問題を見つけてください!VerticalLayout.as の updateDisplayListVirtual(row 1797) には、typicalLayoutElement を使用して LinearLayoutVector を設定するメソッド (updateLLV) への呼び出しがあります。これは、最初の itemRenderer がリストの dataGroup に追加された遅延初期化です。私の場合、それは HeaderItemRenderer (30px) です。

updateLLV の後、LinearLayoutVector で indexOf を呼び出し、verticalScrollPosition を渡すことによって、startIndex (最初に表示されるアイテムのインデックス) が設定されます。(簡単に言うと、verticalScrollPosition / typicalLayoutElement.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 に答える