Я отчаянно пытаюсь исправить странное поведение в своем списке избранных значков: Когда я меняю представление на представление со списком внутри и начинаю прокрутку, список становится белым для фракции второй (полностью полностью перерисованный), но только один раз при прокрутке в первый раз после изменения вида.Flex Mobile: странное поведение в списке IconItemRenderer
В IconItemRenderer добавить галочку:
<s:IconItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark">
...
override protected function commitProperties():void
{
//create checkbox
if(!checkMarkImage && data.isChecked) {
//create image holder
imageHolder = new Group;
addChild(imageHolder);
//create image
checkMarkImage = new BitmapImage();
checkMarkImage.source = checkBoxSource;
imageHolder.addElement(checkMarkImage);
}
//delete checkmark
else if(checkMarkImage && !data.isChecked) {
removeChild(imageHolder);
imageHolder = null;
checkMarkImage = null;
}
super.commitProperties();
}
override protected function layoutContents(w:Number, h:Number):void
{
super.layoutContents(w, h);
//layout the checkmark
if(checkMarkImage) {
// don't do it like this! (see correct answer)
checkMarkImage.x = w-40;
checkMarkImage.y = 14;
}
}
список обработчиков устанавливает метку на выбранном элементе и удаляет его из старого. После этого он вызывает popView(), но когда вы снова приходите к этому представлению, список создается в представлениях addHandler и при запуске прокрутки список ведет себя так, как указано выше.
//list change
protected function myList_changeHandler(event:IndexChangeEvent):void
{
//is already selected?
var item:Object = myList.selectedItem;
if(!item.isChecked) {
//deselect the other one?
var length:int = myList.dataProvider.length;
var oldItem:Object;
for(var i:int = 0; i < length; i++) {
oldItem = myList.dataProvider.getItemAt(i);
if(oldItem.isChecked) {
oldItem.isChecked = false;
myList.dataProvider.itemUpdated(oldItem);
break;
}
}
//select new one
item.isChecked = true;
myList.dataProvider.itemUpdated(item);
}
//pop view
navigator.popView();
}
Я думаю, что проблема в myList.dataProvider.itemUpdated (oldItem), apperently визуализатор считает, что нужно перерисовывать Everthing, но я понятия не имею, почему .. и почему только после того, как вид показан еще раз ...?
Любые идеи, если это ошибка или что-то еще? как я могу избавиться от этого бхасиуса или как я могу отлаживать это правильно? спасибо
Быстрый; но вызов itemUpdated на dataProvider заставит событие dataChange срабатывать в itemRenderer. Я бы ожидал, что это заставит компонент перерисовывать - поскольку это единственная причина вызвать функцию itemUpdated. Но я не вижу обработчика событий dataChange в вашем коде, поэтому я не знаю. – JeffryHouser
Вызов itemUpdated() itemRenderer может либо создать новое изображение галочки, либо удалить старый, так что на самом деле он должен перерисовываться. В ItemRenderer я не использую метод set data(), а метод commitProperties(), поскольку исходные оптимизированные imemRenderers делают то же самое. Но тем не менее, вызывая itemUpdated(), я хочу, чтобы только отдельные элементы списка перерисовывали, а не весь список. – MorbZ
Но большой вопрос: почему список перерисовывается, когда я начинаю прокрутку, это не обязательно – MorbZ