Xamarin Forms:反转集合后ListView的ScrollTo功能失效
问题解决:反转集合后ListView无法滚动到末尾
问题原因
你绑定ListView的是反转后的集合,但调用ScrollTo时传入的是原集合的最后一项——这个项在反转后的集合里是第一项。当指定ScrollToPosition.End时,ListView会将这个第一项滚动到列表底部的可见位置,最终导致列表停留在顶部,而非你期望的末尾。
解决方案
以下两种方式任选其一即可:
方式一:保存反转后的集合,滚动到它的最后一项
先将反转后的集合保存为变量,直接滚动到该集合的最后一项:
private void Tab1Tapped(object sender, EventArgs e) { tab1_label.FontAttributes = FontAttributes.Bold; tab2_label.FontAttributes = FontAttributes.None; tab3_label.FontAttributes = FontAttributes.None; // 保存反转后的集合(转为ObservableCollection保留集合变更通知特性) var reversedTab1List = new ObservableCollection<SettingPageItems>(tab1settingList.Reverse()); settingslistview.ItemsSource = reversedTab1List; if (reversedTab1List.Count != 0) { Device.BeginInvokeOnMainThread(() => { // 滚动到反转后集合的最后一项 settingslistview.ScrollTo(reversedTab1List.Last(), ScrollToPosition.End, false); }); } }
方式二:使用索引重载的ScrollTo方法
直接通过索引滚动到反转后集合的最后位置(反转后集合长度与原集合一致,最后一个索引为Count-1):
private void Tab1Tapped(object sender, EventArgs e) { tab1_label.FontAttributes = FontAttributes.Bold; tab2_label.FontAttributes = FontAttributes.None; tab3_label.FontAttributes = FontAttributes.None; settingslistview.ItemsSource = tab1settingList.Reverse(); if (tab1settingList.Count != 0) { Device.BeginInvokeOnMainThread(() => { // 直接滚动到最后一个索引对应的位置 settingslistview.ScrollTo(tab1settingList.Count - 1, ScrollToPosition.End, false); }); } }
同步修改其他标签
将上述逻辑复制到Tab2Tapped和Tab3Tapped方法中,即可解决所有标签切换时的滚动问题。
内容的提问来源于stack exchange,提问作者Sreejith Sree
相关产品推荐
相关产品推荐

