В коде ниже представленныйAlbumIndex используется для управления selectedIndex TileList. Пункт «пять» изначально выбран. При каждом нажатии кнопки первый элемент в массиве удаляется, а представленныйAlbumIndex уменьшается.
Теоретически выбранный индекс должен оставаться на «пяти» каждый раз, когда нажимается кнопка (пока «пять» не будет удалено). Это работает таким образом для первого нажатия кнопки. Однако при нажатии на 2-ю кнопку подсветка почему-то меняется на «шесть». Кроме того, TileList selectedIndex всегда отстает на единицу.
Почему?
Я попытался заглянуть в ListBase и отследить selectedIndex. Похоже, что selectedIndex сначала обновляется до правильного индекса, но затем в какой-то момент возвращается к правильному index+1. Я не знаю, почему он отступает.
Кажется, это связано с тем, что я выполняю удаление поставщика данных и изменение индекса в одной и той же операции.
Есть ли какая-то функция в TileList, которую я мог бы переопределить, чтобы поддерживать selectedIndex в актуальном состоянии?
Стив
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
applicationComplete="init()">
<mx:Label id="label1" text="{'TileList selected index: ' + albumsThumbnailList.selectedIndex}"
x="255" y="55" width="234"/>
<mx:Label id="label2" text="{'Presented album index: ' + presentedAlbumIndex}" x="255" y="81" width="234"/>
<mx:TileList id="albumsThumbnailList" direction="vertical"
dataProvider="{presentedAlbums}"
selectedIndex="{presentedAlbumIndex}" x="25" y="13"
change="presentedAlbumIndex=albumsThumbnailList.selectedIndex"
height="400"/>
<mx:Button click="test2()" x="297" y="150"/>
<mx:Script>
<![CDATA[
import mx.events.CollectionEvent;
import mx.collections.ArrayCollection;
private var _includedAlbums:ArrayCollection = new
ArrayCollection(["zero","one","two","three","four","five","six","seven"]);
[Bindable]
private var presentedAlbumIndex:int = 5;
private function init():void {
_includedAlbums.addEventListener(CollectionEvent.COLLECTION_CHANGE,
function():void {
dispatchEvent(new Event("albumDataChanged"));
}
);
}
public function test2():void {
_includedAlbums.removeItemAt(0);
presentedAlbumIndex--;
}
[Bindable(event="albumDataChanged")]
public function get presentedAlbums():ArrayCollection {
return _includedAlbums;
}
]]>
</mx:Script>
</mx:Application>