我有两个带有自定义项目渲染器的 Spark 列表。我正在开发一个应用程序,该应用程序使用户能够将这些项目渲染器从一个列表拖到另一个列表。当这些 IR 之一被放到新位置或另一个列表中时,我正在更新数据提供者:我从一个列表的数据提供者中删除对象并将其添加到另一个列表的数据提供者中。这工作正常。
问题是,有时 IR 被缓存并且它没有根据其数据显示正确的信息。
如何强制列表从不缓存 IR,以便每次修改数据提供者时,所有项目渲染都重新创建所有 IR。性能不会成为问题,因为每个列表中的项目很少。
我有两个带有自定义项目渲染器的 Spark 列表。我正在开发一个应用程序,该应用程序使用户能够将这些项目渲染器从一个列表拖到另一个列表。当这些 IR 之一被放到新位置或另一个列表中时,我正在更新数据提供者:我从一个列表的数据提供者中删除对象并将其添加到另一个列表的数据提供者中。这工作正常。
问题是,有时 IR 被缓存并且它没有根据其数据显示正确的信息。
如何强制列表从不缓存 IR,以便每次修改数据提供者时,所有项目渲染都重新创建所有 IR。性能不会成为问题,因为每个列表中的项目很少。
一些东西..
1) ItemRenderers 应该总是被缓存[和重用]。这是首先使用 Flex 列表的好处之一。我怀疑您的 itemRenderer 实施不正确,以至于在数据更改时不会更改。如果您为此共享一些代码,那将很有帮助。但是,基本上,您的 itemRenderer 应该监听 dataChange 事件,并且当数据更改时,您应该使用新数据更新组件的可视显示。
2) 在 Flex 3 中,我发誓将一个项目从一个列表拖到另一个列表会自动更新相关的 dataProviders。您确定需要编写手动代码来进行这些更改吗?但是,您将需要代码来更新相关的后端。
Flextras 有一些优点,但要回答您的具体问题,您可以在 Spark 列表上将 useVirtualLayout 设置为 false。这将确保列表中的每个项目都有一个渲染器,从而避免回收问题。你真的应该只在项目列表相对较短时才这样做,否则你会遇到性能问题,正如 Flextras 所指出的,这是 Flex 回收渲染器的原因。
我在我的设置数据中放置了一个重置方法,以确保重新初始化渲染器变量
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
}