Есть несколько способов сделать это.
Вот очень хакерское решение : используйте значок, и этот значок отправит событие закрытия.
Идея заключается в том, что вы поместите собственный мувиклип в каждую ячейку списка в виде значка.Этот значок будет отправлять событие с указанным индексом ячейки, чтобы вы могли удалить его.
1-й шаг : Создать основное настраиваемое событие для передачи индекса ячейки через:
package{
import flash.events.Event;
public class CloseEvent extends Event{
public static const CLOSE:String = 'close';
public var index:int;
public function CloseEvent(type:String,bubbles:Boolean = true,cancelable:Boolean=true){
super(type,bubbles,cancelable);
}
}
}
2-й шаг: : нарисуйте значок закрытия или что-то еще, преобразуйте его в MovieClip и Экспорт для Actionscript
3-й шаг :Добавьте прослушиватель событий, чтобы отправлять пользовательское событие при нажатии на значок закрытия.
Внутри значка закрытия Movie Clip я поместил следующие действия:
import fl.controls.listClasses.CellRenderer;
//setup click
buttonMode = true;
if(parent) parent.mouseChildren = true;
addEventListener(MouseEvent.MOUSE_DOWN,dispatchClose);
//setup event
var closeEvent:CloseEvent = new CloseEvent(CloseEvent.CLOSE,true);
if(parent) closeEvent.index = CellRenderer(parent).listData.index;
//listen to click and pass on
function dispatchClose(event:MouseEvent):void {
dispatchEvent(closeEvent);
}
Очень простые вещи, слушайтедля мыши вниз создайте событие, установите индекс и отправьте это событие по щелчку.Значок добавляется в средство визуализации ячеек, поэтому для ячейки отображается ее родительский элемент, в котором среди прочих есть свойство listData , которое содержит индекс ячейки.
Итак, вот как тестфрагмент выглядит следующим образом:
import fl.data.DataProvider;
var dp:DataProvider = new DataProvider();
for(var i:int = 0 ; i < 30 ; i++) dp.addItem({label:'item'+(i+1),icon:Close});
ls.dataProvider = dp;
addEventListener(CloseEvent.CLOSE,deleteItem);
function deleteItem(event:CloseEvent):void {
ls.removeItemAt(event.index);
}
Так как CloseEvent всплывает, мы можем поймать его извне значка средства визуализации ячеек и сказать списку, чтобы удалить элемент с этим индексом.Это можно сделать с помощью значка, но необходимо будет «подняться» вверх по иерархии до самого списка, и это уже довольно странно.
Я сделал это, потому что я, вероятно, был таким же ленивымas @ TheDarkIn1978: P для реализации функций ICellRenderer.Затем я снова посмотрел на код вопроса и не понял, почему пользовательская ячейка расширяет Sprite, когда CellRenderer уже реализует функции ICellRenderer.
Итак, вот моя попытка сделать это на менее хакерской способом:
package{
import fl.controls.*;
import fl.controls.listClasses.*;
import fl.data.*;
import flash.events.*;
public class SCListCell extends CellRenderer implements ICellRenderer{
protected var closeButton:Button;
protected var closeEvent:CloseEvent;
override protected function configUI():void {
super.configUI();
closeButton = new Button();
closeButton.label = 'x';
closeButton.buttonMode = true;
closeButton.setSize(30,20);
closeButton.drawNow();
closeButton.addEventListener(MouseEvent.CLICK,close);
addChild(closeButton);
closeEvent = new CloseEvent(CloseEvent.CLOSE);
}
private function close(event:MouseEvent):void{
closeEvent.index = listData.index;
dispatchEvent(closeEvent);
}
override protected function drawLayout():void{
mouseChildren = true;
closeButton.x = width-closeButton.width;
}
}
}
Использовал то же CloseEvent для передачи индекса, и пользовательская ячейка имеет прямой доступ к объекту listData для извлечения индекса, поэтому фрагмент кода выглядиткак это:
import fl.data.DataProvider;
var dp:DataProvider = new DataProvider();
for(var i:int = 0 ; i < 30 ; i++) dp.addItem({label:'item'+(i+1)});
ls.dataProvider = dp;
addEventListener(CloseEvent.CLOSE,deleteItem);
function deleteItem(event:CloseEvent):void {
ls.removeItemAt(event.index);
}
ls.setStyle('cellRenderer',SCListCell);
Чтобы ответить на ваш вопрос :
как мне правильно получить доступ к родительскому объекту List из его пользовательского средства визуализации ячеек?
Вы можете использовать свойство listData средства визуализации ячеек.Вы можете, если хотите, но это означает переход на несколько уровней вверх:
package{
import fl.controls.*;
import fl.controls.listClasses.*;
import fl.data.*;
import flash.events.*;
public class SCListCell extends CellRenderer implements ICellRenderer{
protected var closeButton:Button;
override protected function configUI():void {
super.configUI();
closeButton = new Button();
closeButton.label = 'x';
closeButton.buttonMode = true;
closeButton.setSize(30,20);
closeButton.drawNow();
closeButton.addEventListener(MouseEvent.CLICK,close);
addChild(closeButton);
}
private function close(event:MouseEvent):void{
List(this.parent.parent.parent).removeItemAt(listData.index);
}
override protected function drawLayout():void{
mouseChildren = true;
closeButton.x = width-closeButton.width;
}
}
}
Что делает создание списка таким простым:
import fl.data.DataProvider;
var dp:DataProvider = new DataProvider();
for(var i:int = 0 ; i < 30 ; i++) dp.addItem({label:'item'+(i+1)});
ls.dataProvider = dp;
ls.setStyle('cellRenderer',SCListCell);
CloseEvent не требуется вэто дело.
HTH