Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Баг в spark List (http://www.flasher.ru/forum/showthread.php?t=202525)

il phoenix 21.07.2013 19:47

Баг в spark List
 
Вложений: 1
Добрый день, столкнулся с таким неприятным багом в flex spark компаненте List: реализовал постраничное листание элементов с помощью этого контрола, и когда свойству dataProvider присваиваешь новую коллекцию элементов в нем все элементы инвертируются, но дополнительного события dataChange в каждом ItemRenderer не происходит. Это заметно, т.к. нужно было реализовать анимацию переворачивания карты когда в ItemReтвукук происходит dataChange. Кто-нибудь сталкивался? Или может посоверуете другой контрол для постраничного вывода? Как быть?

В приложении флешка с примером бага постраничного листания, если непонятно написал.

alatar 22.07.2013 02:24

"Я тут что-то сделал и оно как-то не так работает".
Ну почему все надо клещами вытаскивать? Вам помощь нужна или сочувствие?

Добавлено через 5 минут
P.S. Для этого не обязательно менять dataProvider.

il phoenix 22.07.2013 09:34

Цитата:

Вам помощь нужна или сочувствие?
Мне бы помощь)) желательно чтобы менять нужно было по минимуму, я просто думал может быть это известный баг, и есть какой-то простой способ его пофиксить.

Цитата:

Ну почему все надо клещами вытаскивать?
Д я вробе бы ничего особенного не использую.
1. Есть List
2. для него есть ItemRenderer, в нем на событии dataChange стартует ScaleEffect от 0 до 1, потом обновляются иконки и тексты для новых данных, и запускается ScaleEffect от 0 до 1, получается эффект переворачивания карты
3. в контроллере при нажатии на кнопки влево/вправо в свойство dataProvider кладу новый ArrayList. вот вроде бы все, все стандартно

этот баг особенно хорошо заметен при перелистывании первой страницы на вторую, там есть элемент с синей лентой, он стоит на 4 месте в первом ряду, а после нажатия на кнопку ">" он становится вторым во втором ряду, а если поменять у List layout c TileLayout на HorisontalLayout, то элементы будут выстраиваться в ряд, и этот синий элемент будет стоять так же на 4 месте, а при нажатии на кнопку ">" на 7, т.е. на 4 ом месте с конца, и если приглядеться то можно заметить что остальные элементы так же, инвертируются относительно центра. Хочу еще раз отметить что никакого дополнитильного события dataChange в ItemRenderer не происходит, т.е. это мой код который только и должен менять внешний вид у ItemRenderer отрабатывает только один раз, тогда когда надо, в момент когда ScaleEffect который сворачивает карту выполнен, и ScaleEffect который разворачивает карту еще не начался, т.е. когда scale у элемента = 0

вот выложу исходники на всякий случай

ItemRenderer:
Код:

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
              xmlns:s="library://ns.adobe.com/flex/spark"
              xmlns:mx="library://ns.adobe.com/flex/halo"
                          dataChange="onDataChange(event)">
       
        <fx:Script>
                <![CDATA[
               
                import flash.events.Event;
                import flash.utils.setTimeout;
               
                private function onDataChange(e:Event):void
                {
                        setTimeout(hideEffect.play, 50 * itemIndex);
                }
               
                private function onHideEnd(e:Event):void
                {                       
                        bindData();
                        showEffect.play();
                }
               
                private function bindData():void
                {                       
                        var ach:Achievement = Achievement(data);
                        icon.source = AchievementIcons.defineByType(ach.type);
                        achievementName.text = AchievementsNameLocale.defineByType(ach.type);
                        if (achievementName.text.length > 12)
                                achievementName.text = achievementName.text.substr(0, 12);
                        if(ach.isAchieved)
                        {
                                isAchieved.source = CommonIcons.complete;
                                isAchieved.visible = true;
                        }
                        else
                        {
                                isAchieved.visible = false;
                        }
                }
               
                ]]>
        </fx:Script>
       
        <fx:Declarations>
                <s:Scale id="showEffect" target="{effectTarget}" scaleXFrom="0" scaleXTo="1" duration="200" />
                <s:Scale id="hideEffect" scaleXFrom="1" target="{effectTarget}" scaleXTo="0" duration="200" effectEnd="onHideEnd(event)" />
        </fx:Declarations>
                       
        <s:Group id="effectTarget" x="50">
        <s:Group id="container" x="-50">
                <s:Rect width="100" height="110" radiusX="10" radiusY="10">
                        <s:fill>
                                <s:SolidColor color="0xffffff" />
                        </s:fill>
                        <s:stroke>
                                <s:SolidColorStroke color="0x000000" weight="1" />
                        </s:stroke>
                </s:Rect>
               
                <s:VGroup horizontalAlign="center" width="100%" top="5">
                        <s:BitmapImage id="icon" />
                        <s:RichText id="achievementName" />
                </s:VGroup>
               
                <s:BitmapImage id="isAchieved" right="5" bottom="5" />
        </s:Group>
        </s:Group>
       
</s:ItemRenderer>

Вот так создаю List
PHP код:

<s:HGroup verticalAlign="middle" horizontalCenter="0" top="135">
            <
s:Button id="ahievementsPrev" skinClass="view.buttons.PrevButtonSkin" />
            <
s:List id="ahievements" width="531" height="230" 
                
itemRenderer="view.controls.AhievementRenderer"
                
borderVisible="false" contentBackgroundAlpha="0">
                <
s:layout>
                    <
s:TileLayout horizontalAlign="center" />
                </
s:layout>
            </
s:List>
            <
s:Button id="ahievementsNext" skinClass="view.buttons.NextButtonSkin" />
        </
s:HGroup

вот код контроллера, который клики кнопок обрабатывает

achievementsPaginator.current() возвращает Array

Код AS3:

 
 
                private function onAchievementsPrevClick(e:Event):void
                {
                        achievementsPaginator.prev();
                }
 
                private function onAchievementsNextClick(e:Event):void
                {
                        achievementsPaginator.next();
                }
 
                private function onAchievementsPageChange(e:Event):void
                {
                        window.ahievements.dataProvider = new ArrayList(achievementsPaginator.current());
                }


alatar 23.07.2013 01:16

Цитата:

этот баг особенно хорошо заметен при перелистывании первой страницы на вторую, там есть элемент с синей лентой, он стоит на 4 месте в первом ряду, а после нажатия на кнопку ">" он становится вторым во втором ряду...
Это не баг, а нормальное поведение by design. При смене dataProvider все ItemRenderer помечаются как свободные. После чего повторно используются для новых данных. То что, при этом, они окажутся на тех же местах никто не гарантирует.

Вот то, что EffectManager не поддерживает DataGroup для addedEffect и removedEffect эффектов это баг, хоть Adobe и пытаются отмазываться.

Добавлено через 8 минут
Цитата:

Хочу еще раз отметить что никакого дополнительного события dataChange в ItemRenderer не происходит
Именно событие не происходит или просто анимация не выполняется?

il phoenix 23.07.2013 18:17

Цитата:

Именно событие не происходит или просто анимация не выполняется?
событие происходит нормально, тогда когда надо, и анимация выполняется норм

Цитата:

Это не баг, а нормальное поведение by design. При смене dataProvider все ItemRenderer помечаются как свободные. После чего повторно используются для новых данных. То что, при этом, они окажутся на тех же местах никто не гарантирует.
странно блин =( ну ладно
спасибо за объяснение, а можете посоветовать другой контрол на флексе на котором пейджинг с анимацией можно сделать?

alatar 23.07.2013 21:30

Обычный Group, вы все равно функционал List не используете.


Часовой пояс GMT +4, время: 17:45.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.