【问题标题】:Xamarin Forms: Why Can't ListView Preserve Scroll Position on Tab ChangeXamarin Forms:为什么 ListView 不能在选项卡更改时保留滚动位置
【发布时间】:2018-07-06 04:29:31
【问题描述】:

我正在使用BottomNavigationBarXF 覆盖Android 默认的TabLayout。但是,如标题中所述,ListView 无法保留选项卡更改时的滚动位置。当用户从另一个选项卡切换回来时,ListView 似乎会在触摸时更新/刷新,将显示移回最顶部。

发生了什么?什么可能导致此问题以及如何解决?

*我做了一个简单的演示来说明这个问题: https://ufile.io/t33g7

【问题讨论】:

  • 你解决了这个问题吗?

标签: 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 + header‌​Height;
}

absoluteY 是列表视图的滚动偏移量,您可以像我在这里所做的那样简单地添加它,如果您没有提前获得 itemHeight 和 headerHeight,请使用 FindViewById 并获取它们的高度那样。

希望这是有道理的,顺便说一句,这就是它在 Android Xamarin 下的工作方式,所以你需要做一些工作来弄清楚它是如何转化为表单的(从未使用过的表单)

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2018-07-07
    • 2016-09-03
    相关资源
    最近更新 更多