You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:15:11