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();
>>> }
>>> }
>>> 
>> 

Reply via email to