【发布时间】:2013-02-22 10:48:05
【问题描述】:
尝试实现“下拉刷新”我创建了以下简单的测试代码(请添加到新的 Flash Builder 项目,使用“空白”模板,即没有导航栏):
截图:
TestPull.mxml:
<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
applicationComplete="init()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.PropertyChangeEvent;
private static const PADDING:uint = 20;
[Bindable]
private var _ac:ArrayCollection = new ArrayCollection();
private function init():void {
updateList();
_list.scroller.viewport.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, handleScroll);
}
private function updateList():void {
_ac.source = new Array();
for (var i:int = 0; i < 42; i++) {
_ac.source.push(Math.random());
}
_ac.refresh();
}
private function handleScroll(e:PropertyChangeEvent):void {
if (e.source == e.target && e.property == "verticalScrollPosition") {
trace(e.property, ': ', e.oldValue, ' -> ', e.newValue);
if (e.newValue < -2 * PADDING &&
e.oldValue >= -2 * PADDING) {
_hint.visible = true;
setTimeout(hideHint, 2000);
//updateList();
}
}
}
private function hideHint():void {
_hint.visible = false;
}
]]>
</fx:Script>
<s:List id="_list"
dataProvider="{_ac}"
width="100%"
height="100%" />
<s:Label id="_hint"
text="Pull down to refresh..."
width="100%"
textAlign="center"
fontStyle="italic"
backgroundColor="#FFFFCC"
paddingTop="{PADDING}"
paddingBottom="{PADDING}"
visible="false" />
</s:Application>
这似乎运作良好,_hint 可见性每次拉动只切换一次(我已经通过跟踪验证了这一点)。
但是,当我取消注释上面的 updateList() 调用(模拟从 Web 服务器获取数据)时 - 一切都中断了,hint.visible=true 被一次又一次地设置,_list 闪烁。
有没有人给点建议,如何解决我的穷人的刷新问题?
【问题讨论】:
-
当您将项目添加到 arraycollection 时,滚动值/位置是否可能受到影响?这会(可能)再次调用“handleScroll” - 从而闪烁?
-
可能...有什么建议可以解决这个问题吗?
-
也许您可以在刷新时断开 arraycollection 与视图的连接。或者将您加载到新的 ac 中,然后在插入所有其他数据后交换它们。
-
如果提示已经在句柄滚动中可见,则不要更新列表。并隐藏提示不是通过 timeoutm 而是当用户释放鼠标时。
标签: apache-flex flex4 flex4.5 flex4.6 flex-mobile