1

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

怎么了?什么可能导致这种情况以及如何解决?

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

4

1 回答 1

0

我的假设是它与“行墓地”有关,每当您使用列表视图时,您都在重用一组行,假设设备上有 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 下的工作方式,所以你需要做一些工作来弄清楚它是如何转换为表单的(从未使用过的表单)

于 2018-01-26T20:53:43.790 回答