我在UWP / Windows 10应用程序中有一个ListView。列表视图绑定到一个可观察的集合,集合中的每个项目实现INotifyPropertyChanged用于绑定目的。
集合中的项目包含一些immediatley可用数据,通过属性公开并由数据模板中的控件绑定。但是,绑定对象上的某些属性是延迟加载的 - 当项目添加到集合时,数据不会立即可用。通常这些数据来自互联网,通过HTTP调用。有时,当添加项目时,数据已经在后台延迟加载,有时第一次调用属性(由项目数据tempalte中的控件绑定到它)会导致延迟加载启动。当延迟加载完成时,将引发属性更改事件,并且绑定控件将使用新值和屏幕更新进行更新。所有这些都有效。
我得到的症状是,当快速滚动时,通常在滚动条区域内反复单击或按住鼠标按钮时,点击停止时滚动会继续。列表视图继续沿用户滚动的方向滚动,直到它到达列表的末尾。
我认为问题是由物品高度变化引起的。当延迟加载的数据更新并且绑定重新出现时,它们的视觉效果会增长(因为隐形控件现在可见,或者我们现在可以确定我们必须下载的图像的高度,或者我们已经添加了长文本启用自动换行的文本块等)。我认为当某些项目改变高度时,listview会出于某种原因滚动。滚动可能导致尚未滚动的项目被实现(列表被虚拟化),这反过来导致更多的延迟加载,其更新高度并再次滚动,创建一种循环直到到达列表的末尾。我不确定是否是可见或屏幕外项目的高度变化导致问题。可能是列表中较早的项目调整了“向下推”可见项的“顶部”。或者可能是当前可见的项目调整大小会导致列表尝试将这些项目保留在视图中,但会被不断变化的高度混淆。我不知道卷轴到底发生了什么。
我知道如果我禁用延迟加载,或者不提出通知,那么数据加载发生但项目高度/视觉效果不会改变滚动问题不会发生。
鉴于我在检索数据之前无法知道项目的高度,我不想/不能等待所有数据提前检索,任何人都可以想到一个解决方法避免连续滚动问题?
提前致谢。
答案 0 :(得分:1)
您可以尝试在DataTemplate
中使用<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected ="false"
android:drawable="@drawable/bottom_left_border"/>
<item android:state_selected ="true"
android:drawable="@drawable/bottom_left_border_pressed">
</item>
</selector>
,以防止在滚动列表项目时过多加载。这可能会阻止过多的负载以及您看到的一些位移。
除此之外,最好的解决方案是为列表项设置特定高度。如果您从Web源获取的内容大于指定区域,请为用户提供更多&#34;更多&#34;选择看其余的。