【问题标题】:Xamarin Forms: Why Can't ListView Preserve Scroll Position on Tab ChangeXamarin Forms:为什么 ListView 不能在选项卡更改时保留滚动位置
【发布时间】:2018-07-06 04:29:31
【问题描述】:
【问题讨论】:
标签:
listview
xamarin
xamarin.forms
bottombar
【解决方案1】:
我的假设是它与“行墓地”有关,每当您使用列表视图时,您都在重复使用一组行,假设设备上有 15 行可见,Android 将继续跟踪这 15 行的状态。每当您滚动时,该行就会出队,并引入一个新行。如果您随后向上滚动,Android 将重新使用行墓地中的一行,它会保留不再可见的可见行。这样做是为了保持较低的内存使用率并减少渲染时间,因此第一次渲染的行将花费更长的时间,然后连续重新渲染该行会更快。
这意味着,要跟踪滚动偏移量,您需要自己做一些工作。我的建议是有一个共享类,它具有跟踪 UI 状态的静态属性。然后,当您进行选项卡切换时,您设置了一个跟踪列表视图的绝对 y 位置的属性。要获取此值,您需要知道有多少项目不再可见,之前可见,将其乘以 ListItemHeight 并添加 headerHeight,在自定义列表视图中,您可以使用 FirstVisiblePosition 获取适配器第一个可见项目的位置,所以
var pos = this.FirstVisiblePosition;
if(pos > 0)
{
absoluteY += (pos - 1) * itemHeight + headerHeight;
}
absoluteY 是列表视图的滚动偏移量,您可以像我在这里所做的那样简单地添加它,如果您没有提前获得 itemHeight 和 headerHeight,请使用 FindViewById 并获取它们的高度那样。
希望这是有道理的,顺便说一句,这就是它在 Android Xamarin 下的工作方式,所以你需要做一些工作来弄清楚它是如何转化为表单的(从未使用过的表单)