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