Flex: место переключения изображений в листе листов - PullRequest
0 голосов
/ 27 октября 2009

У меня странная проблема с itemRenderers внутри TileList.

Вот рабочий пример без itemRenderer: 152.org/flex/

Вот сломанная версия с itemRenderer: 152.org/brokenExample/
(у меня нет представителя, который бы связал их обоих)

В обоих примерах включен «Просмотр источника».

Чтобы увидеть проблему, используйте разбитый пример, выберите альбом и прокрутите вниз на одну строку. Прокрутите назад вверх, и изображения будут переключены. Если вы попробуете это на рабочем примере, это нормально.

Это, кажется, широко известная ошибка, но я не могу найти решение для нее.

UPDATE
Я снова начал играть с этим примером и узнал кое-что еще. Оказывается, вам не нужно переопределять установщик данных. Вы можете создать новый метод в itemRenderer, который устанавливается всякий раз, когда плитка хочет обновить. Так что хитрость заключается в том, чтобы не полагаться на методы initialize или creationComplete.

Это то, что у меня есть для itemRenderer в приложении.

<itemRenderers:ImageTile img="{data}"/>

Это код, который я имею в itemRenderer.

public function set img(value:String) : void {
  trace("setting source: " + value);
  this.source = value;
  this.name = value.toString().split("/").pop().split(".").shift();
}

Я обновил свой пример , чтобы отразить это изменение.

Ответы [ 2 ]

0 голосов
/ 27 октября 2009

У меня нет под рукой вашего приложения, поэтому я не могу тестировать из конца в конец, но я посмотрел ваш источник. Возможно, вам нужно переопределить установщик data в вашем itemRenderer:

<?xml version="1.0" encoding="utf-8"?>
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()">

 <mx:Script>
  <![CDATA[

   override public function set data(value:Object):void
   {
    super.data = value;
    this.source = data;
    this.name = data.toString().split("/").pop().split(".").shift();
   }

   private function init() : void {
    // Removed from your source and transplanted above
   }

  ]]>
 </mx:Script>

</mx:Image>

Flex будет пытаться повторно использовать средства визуализации элементов в списках (что означает, что события жизненного цикла, которые вы, возможно, ожидаете - инициализировать, creationComplete и т. Д. - не всегда будут срабатывать), поэтому, если вы хотите быть уверены, что ваш модуль визуализации обновляется при изменении элемента данных (как это происходит при событиях прокрутки), поэтому рекомендуется переопределить свойство данных средства визуализации. Это, скорее всего, решит проблему.

0 голосов
/ 27 октября 2009

Может быть, попытаться сделать недействительной на creationComplete?

Из того, что я помню, с DataGrids (которые работают примерно так же, как список плиток), когда элемент попадает в фокус его пересозданного.

<mx:itemRenderer>
  <mx:Image id="myImage" creationComplete="myImage.invalidate()" />
</mx:itemRenderer>

Не пробовал этот код, но я думаю, что именно здесь вы хотите начать поиск.Я взглянул на ваш компонент itemRenderer.Попробуйте creationComplete вместо инициализации, чтобы вызвать вашу функцию

...