如何从 Flex Spark 列表的 DataProvider 对象获取其 ItemRenderer?

发布于 2024-09-29 00:10:40 字数 151 浏览 0 评论 0原文

在 Flex 中,我可以创建一个 ItemRenderer 来表示列表 DataProvider 中的每个项目,但如何通过 DataProviders 对象访问 ItemRenderer 的实例?类似于 myList.getItemRenderer(dp.getItemAt(10));

In Flex I can create an ItemRenderer to represent each item in the Lists DataProvider but how do I access the instance of the ItemRenderer via the DataProviders Object? Something like myList.getItemRenderer(dp.getItemAt(10));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

橘味果▽酱 2024-10-06 00:10:40
public function getItemRenderer(list:List, item:Object):ItemRenderer
{
    var dataGroup:DataGroup = list.dataGroup;
    var n:int = dataGroup.numElements;
    for (var i:int = 0; i < n; i++)
    {
        var renderer:ItemRenderer = dataGroup.getElementAt(i) as ItemRenderer;
        if (renderer && renderer.data == item)
            return renderer;
    }
    return null;
}
public function getItemRenderer(list:List, item:Object):ItemRenderer
{
    var dataGroup:DataGroup = list.dataGroup;
    var n:int = dataGroup.numElements;
    for (var i:int = 0; i < n; i++)
    {
        var renderer:ItemRenderer = dataGroup.getElementAt(i) as ItemRenderer;
        if (renderer && renderer.data == item)
            return renderer;
    }
    return null;
}
忆依然 2024-10-06 00:10:40

通过使用这种方法,你无法获取可视区域之外的渲染器,并且还会出现很多其他问题。

By using this method, you cannot get the renderer that is outside of the viewable area and there will also be a lot of other issues.

黑凤梨 2024-10-06 00:10:40

如果您需要更改项目渲染器的行为方式,请更改导致该行为的数据。

var items:ArrayCollection = this.dataProvider as ArrayCollection;
    var newItems:ArrayCollection = new ArrayCollection();
    if (items.length > 0) {
        for (var i:int = 0; i < items.length; i++) {
            var item:Object = items[i] as Object;

            if (!item.editMode) {
                item.editMode = true;
            } else {
                item.editMode = false;
            }

            newItems.addItem(item);
        }
    }

    this.dataProvider = null;
    this.dataProvider = newItems;

这是一个简单的示例,其中 I 标记要删除的项目,并且渲染器会根据数据更改而更改。对于较大的数据集,我知道这可能会有点慢,但它可以为您提供所需的控制。

如果需要更改某个渲染器,只需修改dataProvider或dataGroup中相应对象上的数据即可。

var item:Object = this.getItemAt(index);

If you need to change how the item renderer is behaving, change the data that is causing the behavior.

var items:ArrayCollection = this.dataProvider as ArrayCollection;
    var newItems:ArrayCollection = new ArrayCollection();
    if (items.length > 0) {
        for (var i:int = 0; i < items.length; i++) {
            var item:Object = items[i] as Object;

            if (!item.editMode) {
                item.editMode = true;
            } else {
                item.editMode = false;
            }

            newItems.addItem(item);
        }
    }

    this.dataProvider = null;
    this.dataProvider = newItems;

This is a simple example where the I mark items to be deletable and the renderer changes according since the data has been changed. For larger data sets, I understand this can be a little slow but it gives you the control you are after.

If you need to change one renderer, simply modify the data on the corresponding object in the dataProvider or dataGroup.

var item:Object = this.getItemAt(index);
反目相谮 2024-10-06 00:10:40

我知道这是一个旧线程,但也许它会对某人有所帮助:

var item:ItemRenderer = list.dataGroup.getElementAt(0) as ItemRenderer;

这将为您提供 ItemRenderer,如果您有自定义 IR,则只需使用该类并进行强制转换和您的设置。

I know this is an old thread, but perhaps it will help someone:

var item:ItemRenderer = list.dataGroup.getElementAt(0) as ItemRenderer;

That will give you the ItemRenderer, if you have a custom IR then just use that class and cast and your set.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文