`
shizhi
  • 浏览: 48844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

List滚动条可能造成ItemRenderer错位的解决方案

    博客分类:
  • Flex
阅读更多

ItemRenderer这种东西很常用,很可惜垂直滚动条拖来拖去(特别是还用上了variableRowHeight)可能造成ItemRenderer的位置不正确,错位或者重叠,这似乎是一个bug了,google半天没啥结果(更可惜的是我没有截图看看,哈)。不单单是List,只要基于ListBase的都有可能。在我自己的案子里,我使用了variableRowHeight=true的List,ItemRenderer是一个VBox,包含了Text和几个Button。每段文字各不相同。

我的案子

我的案子

原因

说实话我没看过源码也不是非常清楚。flex framework从效率上考虑,ItemRenderer不是一次性全部渲染掉的,比如List只能显示两个ItemRenderer,那只会渲染这两个,如果滚动显示了其它,就会渲染其它的ItemRenderer,这个过程比较复杂,以后有空好好研究下。

方案

既然是滚动条,就从滚动条上下手。List继承自ListBase,ListBase来自ScrollControlBase,ScrollControlBase就是处理滚动特性的基类,它有一个protected方法scrollHandler,是用来处理滚动事件的。下面要做的事情就简单了。只要在scrollHandler函数里加上点东西,来保证ItemRenderer位置正确。很可惜这块的原理我也不是很明确,只是在实验的时候发现RESIZE可以重画List,其实它对应的调用updateList方法(ListBase的protected方法),这样位置就会调整正确了。来看看updateList的注释:

Refreshes all rows now. Calling this method can require substantial processing, because can be expensive at it completely redraws all renderers in the list and won’t return until complete.

看看重新扩展的List

package myvocal.visual
{
	import flash.events.Event;
 
	import mx.controls.List;
	import mx.events.*;
 
	public class MyList extends List
	{
		public function MyList()
		{
			//TODO: implement function
			super();
		}
 
		protected override function scrollHandler(event:Event):void
		{
			trace("onUserScroll")
			super.scrollHandler(event);
			this.updateList()
		}
 
	}
}

搞定!

 

http://gain-loss.org/?p=131

分享到:
评论
10 楼 ssxszt 2015-10-15  
我是DataGridColumn下内联引用itemRenderer该如何解决啊?
9 楼 baolove456 2011-12-26  
谢谢,问题已解决
8 楼 HBrO 2011-04-01  
折腾了大半天,问题没解决,才发现滚轮事件不知道是截断了事件流还是不算Scroll事件,后来加上Scroll的重写,问题解决

package myvocal.visual
{
import flash.events.Event;

import mx.controls.List;
import mx.events.*;

public class MyList extends List
{
public function MyList()
{
//TODO: implement function
super();
}

protected override function scrollHandler(event:Event):void
{
trace("onUserScroll")
super.scrollHandler(event);
this.updateList()
}

protected override function mouseWheelHandler(event:MouseEvent):void
{
trace("onMouseWheel")
super.mouseWheelHandler(event);
this.updateList()
}


}
}
7 楼 HBrO 2011-04-01  
对于 renzaihangzhou 那种滚动后图片不能显示的问题,通用的解决方案是用VBox+Repeater代替。Tree和List是比较好模拟的,DataGrid就比较困难
6 楼 renzaihangzhou 2011-03-18  
兄弟,我有个问题,困扰我好几天了,跟你发过的这个个帖子里的内容很相似,所以请教你!呵呵,是这样的,我用list+itemrenderer来批量呈现图片,当拖动滚动条后,再拖回来,部分图片就消失了,我猜测是itemrenderer的问题,但是不知道怎么改,想问下你?
5 楼 kings36503 2011-01-05  
这个问题的另一个解决方案是在datagrid的itemrenderer中重写updatePlayList()方法,将你想要的更新上去。
4 楼 xuhuanchao 2010-11-04  
你好,我继承了datagrid,为什么不可以?

datagrid也属性list组件啊
3 楼 Fonkie 2010-09-08  
这个问题我遇到过,当时问了很多人都不知道是怎么回事,后面取消了滚动,楼主厉害!
2 楼 micheal_7 2010-04-16  
正在开发这个项目,遇到了技术难关,楼主的帖子很有用
1 楼 wuxi15932077655 2009-08-15  
哥们谢谢了!  
我也遇到了这样的问题,昨天就看到你的帖子了不过没有好好看,今天回过头来,尝试了一遍搞定了呵呵

相关推荐

    Flex手机项目自定义List的ItemRenderer

    在Flex手机项目开发中,创建自定义的List组件ItemRenderer是一项常见的需求,目的是为了提供更加丰富和个性化的显示效果。本文将深入探讨如何利用IconItemRenderer来实现这一目标,同时结合具体的实例,介绍两种不同...

    Flex itemRenderer的详细教程

    在 Flex 开发中,ItemRenderer 是一种非常强大的工具,它允许开发者自定义列表(List)、数据网格(DataGrid)等控件中每一项的外观和行为。通过 ItemRenderer,我们可以实现更加灵活和动态的界面设计。 #### 二、...

    理解_Flex_itemRenderer.pdf

    相反,它会创建一个有限数量的itemRenderer实例,并在用户滚动列表时重用这些实例。这些itemRenderer实例会根据需要向上或向下移动,以显示当前可见的行。这种方法大幅提高了应用的性能,但同时也带来了挑战,尤其是...

    解决flex的tilelist中的滚动条下滑,乱渲染问题。

    然而,在实际应用中,我们可能会遇到一些问题,比如当TileList包含可选中的CheckBox时,滚动条滚动可能导致选中状态混乱,以及获取TileList内部数据的困难。本文将详细讲解如何解决这些问题。 首先,我们要理解...

    flex4做的itemrenderer呈现器

    在Flex4中,ItemRenderer是一种强大的工具,用于自定义数据Grid、List或其他数据绑定组件中的项显示方式。本文将深入探讨如何使用Flex4创建一个ItemRenderer,以实现类似雅虎聊天界面的效果,并介绍相关的核心概念和...

    itemrenderer help

    为了避免对框架造成破坏,Flex限制了从外部直接访问ItemRenderer的能力。例如,不能直接修改某个单元格的颜色或内容。这是因为ItemRenderer的设计初衷是为了提高性能和避免内存泄漏。 **3. 性能优化建议** - **...

    itemRenderer 提前加载问题

    可能的解决方案可能包括: 1. **按需加载**:仅在需要显示特定数据项时才创建对应的ItemRenderer,而不是一次性加载所有。 2. **缓存策略**:对于已创建但不再显示的ItemRenderer,可以将其缓存起来,以便再次需要...

    内渲染器_ItemRenderer

    - 例如,如果内渲染器名为`MyItemRenderer1`,则在List的MXML代码中,可以这样设置:`<s:List itemRenderer="components.MyItemRenderer1"/>` - 可以通过在内渲染器中添加事件监听器来处理用户与列表项的交互,如...

    flex itemRenderer 渲染机制的概念和使用

    因此,当项被滚动出视口后,它们可能被回收并用于渲染其他项。因此,记得在`commitProperties()`方法中更新界面状态,以确保渲染器正确反映当前数据项。 ### 三、高级用法 1. **动态itemRenderer** 有时我们可能...

    理解 Flex_itemRenderer

    例如,初始状态下显示第 1-10 行的 renderer 在用户向下滚动后可能会被重用来显示第 11-20 行的数据。 #### 四、外部 Renderer 虽然内联 renderer 很方便,但在处理复杂逻辑或重用 renderer 代码时,推荐使用外部 ...

    flex中的渲染器(itemrenderer)

    flex中经常会使用到渲染器,这里简要介绍一下渲染器的一些知识

    Flex内联itemRenderer

    在Spark组件中,如List或DataGrid,我们通常会用到`<s:List.itemRenderer>`或`<s:DataGrid.itemRenderer>`这样的属性来指定itemRenderer。 下面是一个简单的内联itemRenderer的示例,展示如何在Flex项目中创建和...

    Flex ItemRenderer

    Flex ItemRenderer 是Adobe Flex框架中的一个重要概念,它主要用于自定义MX和Spark组件列表视图(如List、DataGrid等)中的每一项显示样式。ItemRenderer允许开发者根据数据项的内容个性化呈现,提供更丰富的用户...

    Flex 如何得到itemRenderer里面的内容

    2. **访问 listItems 属性**:`ListBaseContentHolder` 提供了一个名为 `listItems` 的属性,它返回一个数组,数组中的每个元素对应着 `dataProvider` 中的一项,并且包含了用于渲染该项的 `ItemRenderer` 实例。...

    Flex中itemRenderer的使用简介

    在Flex开发中,ItemRenderer是一种非常关键的组件,它允许我们自定义MX或者Spark列表类(如List、DataGrid等)中的数据项显示方式。ItemRenderer使得开发者能够以更个性化的方式展示数据,提升用户界面的视觉效果和...

    flex itemRenderer深入学习--flex相册例子

    在我们的相册例子中,ItemRenderer可能包含以下元素: 1. 图片显示:我们可能会使用mx.controls.Image或spark.components.Image组件来展示相册中的图片。我们需要设置其source属性来绑定到数据项中的图片URL。 2. ...

    ActionScript_ItemRenderer

    默认的ItemRenderer可能无法满足所有设计需求,因此自定义ItemRenderer可以让你为每个数据项提供独特的视觉表现,提升用户体验。 要创建一个自定义的ActionScript ItemRenderer,你需要遵循以下步骤: 1. **创建新...

    flex的tree动态加载大量数据与滚动条相关问题探讨

    对于滚动条问题,解决方案可以是:在Tree的滚动事件(scroll)中调用`myTree.invalidateList()`方法,以此来刷新树。这个方法会强制Flex重新渲染Tree的可视部分,有助于缓解滚动时可能出现的显示问题。不过,这种...

    ItemRenderer的用法

    2. **性能优化**:避免在`ItemRenderer`中进行复杂的计算,因为它们可能影响列表的滚动性能。 3. **复用机制**:Flex的列表控件有渲染器复用机制,因此要注意渲染器的状态管理,确保新旧数据间的正确切换。 **示例...

    Flex4.x 构建可编辑的List【带序号排列】

    在Flex4.x中,构建一个可编辑的List组件并实现带序号排列的功能是一项常见的需求,这主要涉及到Flex4的List组件、数据绑定、ItemRenderer自定义以及数据管理等方面的知识。下面将详细介绍如何实现这样的功能。 1. *...

Global site tag (gtag.js) - Google Analytics