Проблема с Flex DataGrid ItemRenderer

У меня есть сетка, заполненная> 1000 наборами данных. один столбец использует настраиваемый itemRenderer, который используется для отображения значения внешнего ключа.

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

Но каким бы замечательным ни было повторное использование, отображение неверной информации не может быть результатом. Итак, как мне избавиться от этой проблемы?

РЕДАКТИРОВАТЬ: Мне удалось избавиться от этой проблемы, но я все равно опубликую код, чтобы указать свой план:

<?xml version="1.0" encoding="utf-8"?>

<mx:Script>
    <![CDATA[
        private var dataAccess : DataAccess = DataAccess.getInstance();
        private var foreign : ArrayCollection = new ArrayCollection();

        private function onCreationComplete() : void
        {

            dataAccess.service.getForeignDatasets.addEventListener("result", onGetForeignDatasets);
            dataAccess.service.getForeignDatasets();
        }

        private function onGetForeignDatasets(event : ResultEvent) : void
        {
            foreign = event.result as ArrayCollection;  
            preSelect();
        }   

        //gets the entry from the foreign entity which matches 
        //the foreign key in this.data
        private function preSelect() : void
        {
            for each(var obj : Object in foreign)
                {
                    if(obj.id == data.foreignKey))
                    {
                        value.text = obj.name;
                        return;
                    }
                }

            value.text = "";    
        }

        private function onDataChange() : void
        {
            preSelect();
        }       
    ]]>
</mx:Script>

I left all the uneccessary code...

Приведенный выше код работает и решает проблему отображения неверных данных.

Есть ли еще идеи по реализации этой функции?


person Thomas    schedule 26.01.2010    source источник


Ответы (3)


Это происходит, если ваше средство визуализации элементов кэширует информацию в частных переменных (или где-нибудь еще). Рендеринг элемента получает данные через свойство «data». Он не должен использовать какие-либо данные, не входящие в свойство «data». Если вам абсолютно необходимо выйти за пределы, чтобы получить другие данные (чего на самом деле делать не следует), убедитесь, что вы аннулируете эти данные при каждом изменении свойства данных (переопределите данные, чтобы отметить измененный флаг, а затем вызовите super.data).

Если это не решит вашу проблему, опубликуйте код средства визуализации элементов.

person Samuel Neff    schedule 26.01.2010

Работая с настраиваемым ItemRenderer для элемента управления DataGrid, у меня тоже была такая проблема. Все было хорошо, но когда я прокручивал DataGrid, мои ItemRenderers не отображали правильные значения. Мне потребовалось много времени, чтобы понять, что происходит. Причина в том, как работают IremRenderers. Помните, что объекты itemRenderers используются повторно. Прочтите очень хорошую статью о средствах визуализации элементов.

Короче говоря, вы должны установить данные для ItemRenderer не в конструкторе или в событии CreationComplete, а в другой функции.

Для MX DataGrid вам необходимо переопределить данные набора общедоступных функций, например:

override public function set data( value:Object ) : void 
{ 
    super.data = value; 
    // your code to set your data 
}

Для Spark DataGrid вы должны сделать это в

override public function prepare (hasBeenRecycled)

Надеюсь, это поможет.

person Elena    schedule 24.04.2012

useVirtualLayout="false" - запретить повторное использование itemRenderers. Это свойство макета базового компонента List.

См. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/layouts/supportClasses/LayoutBase.html#useVirtualLayout

person radistao    schedule 05.12.2012