.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
相关产品推荐
相关产品推荐

