私のカスタムiconitemrendererリストで不思議な動作を修正しようとしています:リストを含むビューをビューに変更してスクロールを開始すると、ビューの変更後に最初にスクロールするときに1回だけ表示されます(完全に再描画されます)。 IconItemRendererでFlex Mobile: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();
}
私はapperentlyレンダラーがそれがeverthingを再描画しなければならないと考えて、なぜ...、なぜビューが再び示された後にのみ、私は見当がつかない、問題がmyList.dataProvider.itemUpdated(oldItem)であると思います...?
これはバグなのですか?どのように私はこのbahaviorを取り除くことができますか、またはこれを正しくデバッグするには?ありがとう
速いもの; dataProviderでitemUpdatedを呼び出すと、itemRendererでdataChangeイベントが発生します。 itemUpdated関数を呼び出す唯一の理由として、コンポーネントを再描画するよう強制することが期待されます。しかし、あなたのコードにdataChangeイベントハンドラがないので、私は不明です。 – JeffryHouser
itemUpdated()を呼び出すと、itemRendererは新しいチェックマークイメージを作成するか、古いチェックマークイメージを削除することができます。実際には、それを再描画する必要があります。 ItemRendererでは、元の最適化されたimemRenderersが同じように機能するため、set data()メソッドを使用せず、commitProperties()メソッドを使用します。しかし、それでもitemUpdated()を呼び出すと、リスト全体ではなく、1つのリスト項目だけを再描画します。 – MorbZ
しかし大きな問題は、スクロールを開始するときにリストが再描画されるのはなぜですか? – MorbZ