![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Контрибьютор базы знаний по Флекс
Регистрация: Aug 2005
Сообщений: 690
|
__________________
Flex 2 и Co |
|
|||||
|
шаманство айтем рендеров это особый раздел флекса..., вобщем в глубине всего этого конкретный экземпляр айтем рендера ни как особо не связан с конкретным элементом (далее "элемент") в дата провайдере. Вернее его связывает свойство айтем рендера(далее "айтем рендер" ))) ) "data" (ну или типа того). Но эта связь очень легко рвущаяся и заменяемая :
В жизни листовые компонеты создают количество айтем рендеров которое помещаеться в видимую область + 1-2 чтобы сделать иллюзию непрерывной прокрутки (ну или если количество элементов помещаеться в сам компонет, то количество айтем рендеров равно ему скролл не отображается). Теперь при прокрутке происходит этакая "карусель", когда айтем рендер скрывается вверху(внизу) то его просто перекидывают вниз (вверх) и меняют ему поле data. Выглядит это гдето так: 1 2 <- первый видимый 3 4 5 6 <- последний видимый после скрола(проскролили на 2 пункта) получаеться: 5 6 <- первый видимый 1 2 3 4 <- последний видимый Вполне вероятно (в твоем случае), создав 10 атем рендеров, при уменьшении размера листа, лист просто не ремувит лишние атем рендеры, а держит их "прозапас" (утверждать не буду, но как вариант, вполне вероятно это глупость я сказал). Но все в конце концов сводиться к следующему при перестройке листа, лист просто выстраивает свои айтем рендеры как нужно и присваивает им соответствующие положению данные data. Тут вполне вероятно просиходит следующия ситуация. При этом присваивании айтем рендер просто думает что ему "досталась" старые данные и ничего не делает. Инвалидейты/валидейты ему пофигу (он выровнял себя как нужно, покрасил станлартные вещи и забил на остальное). Поэтому тебе нужно переопределить несколько методов у твоего айтем рендера, какие конкретно я тебе не скажу, но вполне вероятно это метод получения данных (setData вроде или data его тебе 100% нужно переопределить) вполне вероятно тот метод который "слушает" изменения внутри элемента(данных) , ну и какие-то методы которые отвечают за отрисовку твоего айтем рендера (скорей всего это будет тотже validate*|invalidate* и в нем ты просто будешь задавать соответствующий стиль ). Ну и пару слов про секс. Все кастомные айтем рендеры которые приведены в примерах в виде мхмл это ОТСТОЙ. Они только для красоты и ничего более. Какой-то более менние продвинутый функционал на них построить довольно сложно Усе типа рассказал, когда выросту может даже напишу умную статью ).
__________________
33 коровы Последний раз редактировалось __i; 09.02.2007 в 18:00. |
|
|||||
|
Цитата:
![]() ( http://flasher.ru/forum/showpost.php...98&postcount=5 ) ну разве что нужно убрать апдейтдисплей лист! т.к. они зачем-то все время перерисовывают замечательный айтем. Его нужно заменить на что то более оптимальное
__________________
33 коровы Последний раз редактировалось __i; 09.02.2007 в 18:09. |
|
|||||
|
Регистрация: Oct 2007
Сообщений: 66
|
в itemRenderer в методе set data удаляйте все предыдущие настройки редерера и будет вам счастье!
Вот пример одного из моих айтимов смысл его в том что бы показывать в виде цветных прямоугольников историю перемещения объекта package su.quarta.kadry
{
import flash.events.Event;
import mx.containers.Canvas;
import mx.core.UIComponent;
import su.quarta.kadry.webservices.GetRemoveHistoryResultEvent;
import su.quarta.kadry.webservices.KadryWebService;
import mx.core.IDataRenderer;
public class HistoryPanel extends Canvas //DataGridItemRenderer
{
private var c:Canvas = new Canvas();
private var _lineWidth:int=10;
private var _lineHeight:int=20;
private var _data:XML;
private var _dataXML:XML;
private var actualItemRenderer:IDataRenderer
private var kws:KadryWebService = new KadryWebService();
public function HistoryPanel()
{
super();
init();
}
private function init():void
{
kws.addEventListener(GetRemoveHistoryResultEvent.GetRemoveHistory_RESULT,onResult);
}
override public function get data():Object
{
return _data;
}
override public function set data(value:Object):void
{
_data = value as XML ;
removeAllChildren();
create()
}
private function onResult(evt:Event):void
{
create()
}
private function create():void
{
var x:int;
for(var i:int=0;i<this._data.History.item.length();i++)
{
x=i*(_lineWidth+1);
var item:XML = new XML(this._data.History.item[i]);//подставить цвет
var color:String = String(item.@color).replace("#","0x");
var myUIComponent:UIComponent = new UIComponent();
myUIComponent.graphics.beginFill(uint(color));//
myUIComponent.graphics.drawRect(x,0,_lineWidth,_lineHeight);
this.addChild(myUIComponent);
}
}
}
}
|
|
|||||
|
4AM Games
|
__i прав, тебе нужно переопределять itemRenderer.
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^ Последний раз редактировалось 7thsky™; 10.02.2007 в 02:23. |
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
Согласен, и айтем рендер должен реализовывать mx.controls.listClasses.IDropInListItemRenderer
тогда будет у элемента {get | set} listData ():BaseListData, где в BaseListData есть и rowIndex и columnIndex собственно Nirth дал самое оптимальное решение Последний раз редактировалось 7thsky™; 10.02.2007 в 02:41. |
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
Сanvas не реализует например
|
|
|||||
|
Контрибьютор базы знаний по Флекс
Регистрация: Aug 2005
Сообщений: 690
|
нормальное решение:
http://www.mikenimer.com/index.cfm/2...Grid-component
__________________
Flex 2 и Co |
|
|||||
|
Регистрация: Jul 2006
Сообщений: 38
|
У меня возник вопрос, а как можно поменять цвет строки уже во время работы? например после какого-то действия пользователя?
|
![]() |
![]() |
Часовой пояс GMT +4, время: 19:13. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|