listview - Xamarin.Forms - ListView 加载/填充后如何滚动到底部?
问题描述
我有一个由自定义渲染器组成的 ListView。我希望用户在进入页面时滚动到 ListView 的底部。
由于我的内容已绑定,因此似乎 OnAppearing 被触发得太早(在我的 ListView 加载之前)。如何在正确的时间触发 ScrollToLast()?
protected override void OnAppearing()
{
base.OnAppearing();
this.ItemsListView.ScrollToLast();
}
public class CustomListView : ListView
{
public CustomListView() : this(ListViewCachingStrategy.RecycleElement)
{
ScrollToLast();
}
public CustomListView(ListViewCachingStrategy cachingStrategy)
: base(cachingStrategy)
{
}
public void ScrollToLast()
{
try
{
if (ItemsSource != null && ItemsSource.Cast<object>().Count() > 0)
{
var lastItem = ItemsSource.Cast<object>().LastOrDefault();
if (lastItem != null)
{
ScrollTo(lastItem, ScrollToPosition.End, false);
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
}
解决方案
ObservableCollection 有一个方法CollectionChanged
,它在添加、删除、更改、移动或刷新整个列表时发生。
所以
将您的列表指定为
ObservableCollection
。处理
CollectionChanged
方法中的逻辑。
示例代码
public MainPage()
{
InitializeComponent();
list.CollectionChanged += MyGroupTickets_CollectionChanged;
for (int i =0; i < 100; i++)
{
list.Add(i.ToString());
}
listView.ItemsSource = list;
}
private void MyGroupTickets_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
listView.ScrollTo(list[list.Count - 1], ScrollToPosition.End, false);
}
测试结果
推荐阅读
- javascript - 在单击功能上从 vue js 减少 MongoDb 列中的数字
- python - pandas concat() 不在同一列上加入
- forms - 如何在 vueJS 中删除输入焦点上的错误提示
- sql - 群组分析
- python - 我试图让玩家在 pygame 中移动,但它没有用,它给了我这个错误:
- biztalk - 首次使用时 BizTalk 主机延迟
- c# - JsonTextReader.Read() 超时 - 我陷入了一个 while 循环
- python - 从 python 运行 vssadmin
- c# - 从单击带有“点”的动态按钮获取坐标
- dataframe - Julia - 数据框 - 具有 by() 的多输入函数中的同一列