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

.NET Maui中如何获取Android和iOS平台ListView的当前可见项?

在.NET MAUI中获取ListView可见项的实现方案

在.NET MAUI中,目前没有跨平台统一的API直接获取ListView的可见项,因此仍然需要编写平台特定代码来实现该功能。MAUI采用Handler架构替代了Xamarin的Renderer模式,代码需要做相应适配,以下是调整后的实现:

Android平台实现

List<ViewerItemViewModel> GetVisibleItems(ListView lv)
{
    var visibleItems = new List<ViewerItemViewModel>();
    try
    {
        // 获取原生ListView控件
        var nativeListView = lv.Handler.PlatformView as Android.Widget.ListView;
        if (nativeListView == null) return visibleItems;

        for (int i = 0; i < nativeListView.ChildCount; i++)
        {
            var view = nativeListView.GetChildAt(i);
            if (view.Visibility != Android.Views.ViewStates.Visible)
                continue;

            int pos = nativeListView.GetPositionForView(view);
            if (pos < 0 || pos == Android.Widget.AdapterView.InvalidPosition || pos >= nativeListView.Adapter.Count)
                continue;

            var obj = nativeListView.Adapter.GetItem(pos);
            if (obj == null)
                continue;

            if (obj is ViewerItemViewModel visibleElement && !visibleItems.Contains(visibleElement))
                visibleItems.Add(visibleElement);
        }
    }
    catch (Exception ex)
    {
        // 按需添加异常处理逻辑
    }
    return visibleItems;
}

iOS平台实现

List<ViewerItemViewModel> GetVisibleItems(ListView lv)
{
    var visibleItems = new List<ViewerItemViewModel>();
    try
    {
        var items = lv.ItemsSource.OfType<ViewerItemViewModel>().ToList();
        // 获取原生UITableView控件
        var nativeListView = lv.Handler.PlatformView as UIKit.UITableView;
        if (nativeListView == null) return visibleItems;

        var visibleIndexPaths = nativeListView.IndexPathsForVisibleRows;
        if (visibleIndexPaths == null) return visibleItems;

        foreach (var indexPath in visibleIndexPaths)
        {
            if (indexPath.Row >= 0 && indexPath.Row < items.Count)
                visibleItems.Add(items[indexPath.Row]);
        }
    }
    catch (Exception ex)
    {
        // 按需添加异常处理逻辑
    }
    return visibleItems;
}

核心调整点

  • 替换Xamarin中的GetRenderer()调用,MAUI中通过ListView.Handler.PlatformView直接获取原生平台控件
  • 保留原Xamarin实现的核心逻辑,仅适配MAUI的Handler架构
  • 优化了类型转换和集合操作的写法,提升代码简洁性

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:51:13