我正在使用BottomNavigationBarXF来覆盖Android默认的TabLayout。但是,如标题中所述,ListView无法保留选项卡更改时的滚动位置。当用户从另一个选项卡切换回来时,ListView似乎在触摸时更新/刷新,将显示器移回最顶层。
发生了什么事?可能导致此问题的原因以及如何解决?
*我做了一个简单的演示来说明问题: https://ufile.io/t33g7
答案 0 :(得分:0)
我的假设是它与“行墓地”有关,每当你使用列表视图时,你重复使用一组行,假设设备上有15行可见,Android将继续跟踪这15行的状态。无论何时滚动,行都会出列,并且会引入一个新行。如果然后向上滚动,Android将重新使用行墓地中的一行,它会保留可见的不再可见的行。这样做是为了保持较低的内存使用率,并减少渲染时间,因此首次渲染时的行将花费更长时间,然后行的连续重新渲染将更快。
这意味着,要跟踪滚动偏移,您需要为自己做一些工作。我的建议是有一个共享类,它具有跟踪UI状态的静态属性。然后,当您执行制表符切换时,您可以设置一个跟踪列表视图的绝对y位置的属性。要获得此值,您需要知道先前可见的不再可见的项目数,乘以ListItemHeight并添加headerHeight,在自定义列表视图中,您可以使用FirstVisiblePosition来获取适配器的第一个可见项的位置,所以
var pos = this.FirstVisiblePosition;
if(pos > 0)
{
absoluteY += (pos - 1) * itemHeight + headerHeight;
}
其中absoluteY
是listview的滚动偏移量,你可以像我在这里一样简单地添加它,如果你没有提前使用itemHeight和headerHeight,请使用FindViewById
并以这种方式达到他们的高度。
希望这是有道理的,顺便说一句,这就是它在Android Xamarin下的工作原理,所以你需要做一些工作来弄清楚它是如何转化为表格的(从未使用过表格)