flex 4のスパークリストでアイテムレンダーキャッシュを避けてください
-
02-10-2019 - |
質問
カスタムアイテムレンダラーを備えた2つのスパークリストがあります。ユーザーがこれらのアイテムレンダラーを1つのリストから別のリストにドラッグできるようにするアプリケーションに取り組んでいます。これらのIRSのいずれかが新しい位置または別のリストにドロップされると、DataProvidersを更新しています。あるリストのDataProviderからオブジェクトを削除し、他のDataProviderに追加します。これは大丈夫です。
問題は、IRがキャッシュされ、そのデータに基づいて正しい情報を表示しない場合があることです。
リストにIRSをキャッシュしないように強制するにはどうすればよいですか。これにより、すべてのアイテムがすべてのIRSを再作成するすべてのアイテムを変更するたびに。各リストにアイテムが少ないため、パフォーマンスは問題になりません。
解決
Flextrasにはいくつかの良い点がありますが、特定の質問に答えるために、Sparkリストのfalseにusevirtuallayoutを設定できます。これにより、リスト内のすべてのアイテムにレンダラーがあるため、リサイクルの問題が回避されます。ただし、比較的短いアイテムリストがある場合にのみこれを行う必要があります。そうしないと、Flextrasが指摘したように、Flex Recycles Renderersが指摘しているパフォーマンスの問題が発生します。
他のヒント
いくつかのこと..
1)アイテムレンダーは常にキャッシュされる必要があります[そして再利用]。これは、そもそもフレックスリストを使用することの利点の1つです。 ItemRendererは、データが変更されたときに変更されないように、正しいことに実装されていると思います。このためにいくつかのコードを共有すると、役立ちます。ただし、基本的に、ItemRendererはDatachangeイベントを聞く必要があり、データが変更されたら、コンポーネントの視覚的な表示を新しいデータで更新する必要があります。
2)Flex 3では、アイテムをあるリストから別のリストにドラッグすると、関連するDataProvidersが自動的に更新されたことが誓いました。これらの変更を加えるには、手動コードを書く必要がありますか?ただし、バックエンドを関連するように更新するコードが必要です。
セットデータにリセットメソッドを入れて、レンダラー変数が再活性化されていることを保証します
override public function set data(object:Object):void
{
if (object == null)
{
return;
}
reset(); // reset locals to their base. ie. x=0, y=0, counter=0
// set up renderer using data
}