Check out SmoothDataLoader and InfiniteScroller. Those two together have solved my performance issues. You can probably avoid VirualList.
> On Oct 23, 2023, at 10:28 PM, Hugo Ferreira <hferreira...@gmail.com> wrote: > > Hi Maria, > > I'm very busy right now. > As soon as I manage time, I will check and let you know. > > Maria Jose Esteve <mjest...@iest.com> escreveu no dia domingo, 22/10/2023 > à(s) 11:25: > >> Hi Hugo, >> I have created a branch in royal-community-examples [1] to be able to do >> the tests. >> I have added my implementation and it is as the main view (if you compile, >> it will be the only view you see when you run). >> Could you add an example of your implementation there? >> >> [1] >> https://github.com/mjesteve/royale-examples-community/tree/jewel-virtuals/virtualList-scrollToIndex >> >> Hiedra >> >> -----Mensaje original----- >> De: Hugo Ferreira <hferreira...@gmail.com> >> Enviado el: sábado, 21 de octubre de 2023 18:34 >> Para: dev@royale.apache.org >> Asunto: Re: Function to refresh a VirtualList >> >> For me (on my tests) seems to finally works OK now: >> >> For VirtualList: >> >> public function refresh():void >> { >> var index:int = selectedIndex; >> var top:int = element.scrollTop; >> >> var oldDataProvider:Object = dataProvider; dataProvider = null; >> dataProvider = oldDataProvider; >> >> if ((dataProvider as IArrayList).length > 0) { selectedIndex = index; >> element.scrollTop = top; //during the tests I found some inconsistence, so >> it's need a delay before select the item setTimeout(function():void { var >> itemRenderer:IItemRenderer = (view as >> VirtualListView).getItemRendererForIndex(selectedIndex); >> if (itemRenderer != null) >> itemRenderer.element.click(); >> }, 500); >> setFocus(); >> } >> } >> >> For VirtualDataGrid I'm using an addition component to add buttons on my >> bottom of the Grid with the following and working good functions: >> >> private function onAddClicked():void >> { >> var entity:Object = new modelType(); >> if (dataGrid.dataProvider is EntityList && entity is IEntity) >> (dataGrid.dataProvider as EntityList).addEntity(entity as IEntity); else >> (dataGrid.dataProvider as ArrayList).addItem(entity); >> >> if (dataGrid.dataProvider is EntityList) (dataGrid.dataProvider as >> EntityList).refresh(); >> >> dataGrid.selectedIndex = (dataGrid.dataProvider as ArrayList).length - 1; >> >> var scrollHeight:int = dataGrid.element.children.item(1).children.item(0 >> ).scrollHeight; >> for each (var item:* in dataGrid.element.children.item(1).children) >> { >> item.scrollTop = scrollHeight; >> } >> >> dispatchEvent(new Event(ADDED)); >> } >> >> private function onRemoveClicked():void >> { >> var index:int = dataGrid.selectedIndex; >> var top:int = dataGrid.element.children.item(1).children.item(0).scrollTop; >> >> if (dataGrid.dataProvider is EntityList && dataGrid.selectedItem is >> IEntity) (dataGrid.dataProvider as >> EntityList).deleteEntity(dataGrid.selectedItem as Entity); else >> (dataGrid.dataProvider as ArrayList).removeItem(dataGrid.selectedItem); >> >> if (dataGrid.dataProvider is EntityList) (dataGrid.dataProvider as >> EntityList).refresh(); >> >> dataGrid.selectedIndex = index; >> >> for each (var item:* in dataGrid.element.children.item(1).children) >> { >> item.scrollTop = top; >> } >> >> dispatchEvent(new Event(DELETED)); >> } >> >> >> EntityList , IEntity and Entity are classes of my own AS3-ORM. >> >> Maria Jose Esteve <mjest...@iest.com> escreveu no dia sábado, 21/10/2023 >> à(s) 17:19: >> >>> Hi Hugo, >>> Yes, that problem has given me a lot of headaches and "in the end" it >>> was stronger than me. >>> As I see that you are also with this issue I could reactivate it and >>> see if, between the two of us, we can give a good solution (I think we >>> have discussed this same issue several times in this list and in the >> users list). >>> >>> In my case I took as reference Jewel List and its "scrollToIndex" >>> (that we debugged it with Carlos some time ago). >>> From my point of view, when you refresh the dataprovider, as well as >>> when you assign a selectedIndex, the list must be positioned in that >>> element and make it visible. >>> >>> I managed to solve it in VirtualComboBox but with the VirtualList it >>> didn't work too well; moreover, if the control "is not visible" when >>> the dataprovider is assigned, the elements are NOT CREATED correctly. >>> I know I was close to the solution, but I was stuck and, at the time, >>> there were no people using these controls and they couldn't give me >>> any additional support. >>> >>> I seem to remember that I implemented and debugged it in the >>> royal-examples-community project but my memory may fail me.... >>> >>> I will be happy to try to solve these problems together with you, I >>> don't have much time now, but I can try again with you if you agree. >>> >>> Let me know if we can do it and I will look for the implementation. >>> Hiedra >>> >>> -----Mensaje original----- >>> De: Hugo Ferreira <hferreira...@gmail.com> Enviado el: sábado, 21 de >>> octubre de 2023 12:17 >>> Para: dev@royale.apache.org >>> Asunto: Function to refresh a VirtualList >>> >>> Hi, >>> >>> I didn't post on Royale mailing list for a while. >>> Very busy. >>> >>> I use VirtualList and VirtualDataGrid however they are not perfect. >>> >>> One thing that always bothered me was that if I need for example to >>> remove an element of the list, then I need to refresh the dataProvider >>> and I have to notify the List, losing the selectedItem and scroll >>> position. This gives a very bad experience to the user. >>> >>> I finally put time on this and did this working for me. >>> Works on the top item (the easy ones), works on the middle of the list >>> (the chalange ones because it's a Virtual container) and also works >>> for the last item. >>> The code it's not 100% beatutifull for the eye (the reason to not push >>> to the repository), however the issue is also chalanging. >>> If someone have the same issue as I did, here my solution (for now). >>> Next I will do the same for DataGrid and should be similar to this >>> solution. >>> >>> If someone have a more elegant solution or find out an improvement >>> that I missed, please reply. >>> >>> public function refresh():void >>> { >>> var index:int = selectedIndex; >>> var top:int = element.scrollTop; >>> >>> var oldDataProvider:Object = dataProvider; dataProvider = null; >>> dataProvider = oldDataProvider; >>> >>> if ((dataProvider as IArrayList).length > 0) { selectedIndex = index; >>> element.scrollTop = top; //during the tests I found some >>> inconsistence, so it's need a delay before select the item >>> setTimeout(function():void { var itemRenderer:IItemRenderer = (view as >>> VirtualListView).getItemRendererForIndex(selectedIndex); >>> if (itemRenderer != null) >>> itemRenderer.element.click(); >>> }, 500); >>> setFocus(); >>> } >>> } >>> >>