Xamarin下拉刷新
Xamarin 2018/1/3 10:12:41 768

ListView 的下拉刷新

下拉刷新还是很简单的, 首先要设置 listView.IsPullToRefreshEnabled 为 true

 当下刷新时, RefreshCommand 会被调用,Refreshing 事件会被执行。IsRefreshing 会被设置为 true  实现 RefreshCommand 或 Refreshing 事件。 当刷新完成,调用 EndRefresh 或设置 IsRefreshing 为 false, 来告诉 listView 刷新已经完成。

01.1 ///
02.2 /// 下拉刷新事件
03.3 ///
04.4 ///
05.5 ///
06.6 public void RefreshData(object sender, EventArgs e) {
07.7     this.PageIdx = 0;
08.8     this.LoadConsigns(true);
09.9     var lst = (ListView)sender;
10.10     lst.IsRefreshing = false;
11.11 }

ListView 的 Footer

下拉刷新有自带事件可以处理, 但是加载更多却没有原生支持.
一开始,我在 ListView 的 Footer 中加了一个 Button , 点击的时候加载更多的数据, 在 WP 和 Android 下表现完美.
但是在 iOS 下:

采用 Xamarin.Forms 1.4.3.6358-pre2 时, Footer 错位, 具体是因为 HasUnevenRows 为 True, 行高不是默认的行高, 而计算 Footer 的位置的时候, 是用的默认的行高. 如果设置行高的话,就不会错位, 但是场景中不能设置行高. 采用 Xamarin.Forms 1.4.2.6359 直接报错.

无奈之下,只好放弃这种做法.


ListView 的 ItemAppearing事件

上面说放弃在 ListView 中加Footer, 但是加载更多这个功能还是要完成的.
先来看一下如何用 ItemAppearing 来处理加载更多的:

01.1 ///
02.2 /// 最后一条数据展现时,加载更多
03.3 ///
04.4 ///
05.5 ///
06.6 public void LastAppear(object sender, ItemVisibilityEventArgs e) {
07.7     if (this.Datas.Last().Equals(e.Item)) {
08.8         this.LoadConsigns();
09.9     }
10.10 }

即拿事件参数中的 e.Item 来和数据源中的最后一条来比较, 如果是同一个对象, 说明最后一条已经展现在当前可见屏幕范围之内, 可以加载更多数据了.
这样做,在 iOS 和 Android 下表现很完美.

但是在 WP 下却有可能加载完了第一页,紧接着加载第二页的问题.
因为在 WP 下是用 LongListSelector 来模拟的 ListView, LongListSelector 用了UI虚化技术, 虚化的条数貌似和一屏能显示的条数有关, 具体多少条不能设置, LongListSelector 自己维护.
相同的情况还发生在 TabbedPage 的子页中, 假设一个 TabbedPage 有4个ContentPage , 在初次进入App 的时候, 前两个 ContentPage 的 OnAppearing 事件都会触发.

ListView 的 Group Header

ListView 的Group Header 如果用 Template, 在 WP / Android 下, 表现完美.
但是 iOS 7.1 下直接不显示, 在 8.1时而显示,时而不显示, 并伴有稍微的错位.
如果不用 Template , 表现是挺好的.

同一个页面,多个 ListView 

如果有这样的页面, 那请直接换 TableView , 将原来想放到两个 ListView 中的数据分别写到一个 TableView 的不同 TableSection 中.
因为多个 ListView 上下显示, 并不会自动'流式布局'.


提升 ListView 的性能

这部分是 Xamarin.form 官方的文档读书笔记, 贴出来给你做个参考, 因为它很重要:
有两点会使 ListView 性能受损:
1,using ViewCell's with lots of views, and
2,using layouts that require lots of measurement.
1,在 cell 中使用过多的 views(控件)
2,过多的布局测量

为达到最优性能:
1,使用内建的 Cell (TextCell/ ImageCell /SwitchCell /EntryCell)
2,尽量少的元素。
3,避免层级嵌套;可以使用 AbsoluteLayout 或 Grid 来减少嵌套。
4,避免 Fill 之外的 LayoutOptions 选项。


提升打开新页面的体验速度

在 iOS 和 WP 下, 切换页面效果很流畅, Android 表现的有些卡.
做为优化, 我把加载数据从构造函数移到 OnAppearing 事件中, 并做了一个 500 毫秒的延时:

 
评论列表(登陆后进行留言) 更多...
  • 没有任何回答

验证码