【问题标题】:How to get visible items from Syncfusion list view?如何从 Syncfusion 列表视图中获取可见项目?
【发布时间】:2021-02-16 19:36:30
【问题描述】:
我在 Xamarin.Forms 项目中工作并使用 Syncfusion SfListView 控件作为列表。
现在我只想在初始基础上和滚动列表视图后获取可见项目。意味着滚动停止后,我需要通过 API 获取更新来更新可见项目。
如何在 Xamarin.Forms Syncfusion SfListView 中实现这一点?
谁能给出解决方案?
谢谢。
【问题讨论】:
标签:
listview
xamarin
xamarin.forms
syncfusion
【解决方案1】:
我们想通知您,您可以从 VisualContainer 的 Children 属性获取加载时创建的项目。此外,您可以使用 VisualContainer.ScrollRows.LastBodyVisibleLineIndex 属性获取最后一个可见项的信息。
VisualContainer.Children 将包含可见项目的详细信息。
public class Behavior : Behavior<ContentPage>
{
SfListView ListView;
VisualContainer VisualContainer;
protected override void OnAttachedTo(ContentPage bindable)
{
ListView = bindable.FindByName<SfListView>("listView");
VisualContainer = ListView.GetVisualContainer();
ListView.ScrollStateChanged += ListView_ScrollStateChanged;
base.OnAttachedTo(bindable);
}
private void ScrollView_Scrolled(object sender, ScrolledEventArgs e)
{
}
private void ListView_ScrollStateChanged(object sender, ScrollStateChangedEventArgs e)
{
if (e.ScrollState == ScrollState.Idle)
{
var visibleItems = VisualContainer.Children;
var lastVisibleItem = VisualContainer.ScrollRows.LastBodyVisibleLineIndex;
}
}
}
【解决方案2】:
SfListView 允许在使用 Changed 事件滚动时进行通知。通过使用该事件,您可以根据LastBodyVisibleLineIndex属性和底层集合计数来判断是否到达了SfListView中列表的最后一项。
您可以使用下面的代码。
using Syncfusion.ListView.XForms.Control.Helpers;
public partial class MainPage : ContentPage
{
VisualContainer visualContainer;
bool isAlertShown = false;
public MainPage()
{
InitializeComponent();
visualContainer = listView.GetVisualContainer();
visualContainer.ScrollRows.Changed += ScrollRows_Changed;
}
///<summary>
///To notify when end reached
///</summary>
private void ScrollRows_Changed(object sender, ScrollChangedEventArgs e)
{
var lastIndex = visualContainer.ScrollRows.LastBodyVisibleLineIndex;
//To include header if used
var header = (listView.HeaderTemplate != null && !listView.IsStickyHeader) ? 1 : 0;
//To include footer if used
var footer = (listView.FooterTemplate != null && !listView.IsStickyFooter) ? 1 : 0;
var totalItems = listView.DataSource.DisplayItems.Count + header + footer;
if ((lastIndex == totalItems - 1))
{
if (!isAlertShown)
{
// do something to update the visible items by getting updates through API.
DisplayAlert("Alert", "End of list reached...", "Ok");
isAlertShown = true;
}
}
else
isAlertShown = false;
}
}