私は変数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がどこにも考慮されていないことです!