我有一个带有变量 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!