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