【发布时间】:2012-02-29 17:44:36
【问题描述】:
我正在拼命尝试修复我的自定义 iconitemrenderer 列表中的一个奇怪行为:当我将视图更改为包含列表的视图并开始滚动时,列表在几分之一秒内变为白色(显然完全重绘) ,但在视图更改后第一次滚动时只有一次。
在 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();
}
我认为问题出在 myList.dataProvider.itemUpdated(oldItem) 中,显然渲染器认为它必须重绘所有内容,但我不知道为什么......为什么只有在再次显示视图之后......?
如果它是一个错误或什么的任何想法?我怎样才能摆脱这种行为,或者我怎样才能正确调试这个?谢谢
【问题讨论】:
-
一个快速的;但是在 dataProvider 上调用 itemUpdated 将强制在 itemRenderer 中触发 dataChange 事件。我希望这会强制组件重绘——因为这是调用 itemUpdated 函数的唯一原因。但是我在您的代码中没有看到 dataChange 事件处理程序,所以我不清楚。
-
通过调用 itemUpdated(),itemRenderer 可以创建新的复选标记图像或删除旧的图像,因此实际上它必须重绘。在 ItemRenderer 中,我不使用 set data() 方法,而是使用 commitProperties() 方法,因为原始优化的 imemRenderers 也是这样做的。但尽管如此,通过调用 itemUpdated() 我只想重绘单个列表项,而不是整个列表。
-
但最大的问题是:为什么我开始滚动时列表会被重绘,这不是必需的
-
我无法理解代码,因为您似乎只提供了 sn-ps。如果我理解,第一次滚动 b/c 时,所有内容都会重绘,更改处理程序中的初始循环会告诉每个项目重绘。更改处理程序何时被解雇?来自列表还是来自渲染器?我认为您需要提供一个可运行的示例来演示问题以获得最佳结果。
-
我创建了一个新的应用程序,我刚刚添加了所需的部分。由于某种原因,这种行为是不可重现的。现在是第 2 天,我正在尝试找出一个在最终应用程序中仅持续几分之一秒的问题-.-
标签: actionscript-3 apache-flex mobile itemrenderer flex4.6