您好,登錄后才能下訂單哦!
最近幾天在研究上拉加載啊,下拉刷新啊什么的。然而坑爹的事情總是那么多。在xamarin.forms中,list自帶的,并沒有上拉加載的這個屬性(難道當初他們封裝方法時,就不會想到數據多了會咋整嗎?)抱怨歸抱怨,問題總是要解決的。
既然沒有,那就自己寫一個嘍~
我的思路是這樣的,
什么是上拉刷新,那是不是就是說,在當前頁面,看到最后一個item的時候,我需要加載一些新的數據,那我是不是可以寫一個,只要出現了最后一個item我們就去刷新最新數據呢?
1 public class InfiniteListView : ListView 2 { 3 public static readonly BindableProperty LoadMoreCommandProperty = BindableProperty.Create(nameof(LoadMoreCommand), typeof(ICommand), typeof(InfiniteListView)); 4 public static readonly BindableProperty CanLoadMoreProperty = BindableProperty.Create(nameof(CanLoadMore), typeof(bool), typeof(InfiniteListView), true); 5 6 public ICommand LoadMoreCommand 7 { 8 get { return (ICommand)GetValue(LoadMoreCommandProperty); } 9 set { SetValue(LoadMoreCommandProperty, value); }10 }11 12 public bool CanLoadMore13 {14 get15 {16 return (bool)GetValue(CanLoadMoreProperty);17 }18 set19 {20 SetValue(CanLoadMoreProperty, value);21 }22 }23 24 public InfiniteListView()25 {26 ItemAppearing += InfiniteListView_ItemAppearing;27 }28 29 private void InfiniteListView_ItemAppearing(object sender, ItemVisibilityEventArgs e)30 {31 if (!CanLoadMore)32 {33 return;34 }35 var items = ItemsSource as IList;36 37 if (items != null && e.Item == items[items.Count - 1])38 {39 if (LoadMoreCommand != null && LoadMoreCommand.CanExecute(null))40 LoadMoreCommand.Execute(null);41 }42 }43 }
我們來繼承listview,來實現它的ItemAppearing方法,然后再方法里一次次的判斷有沒有到最后一個item(說實話我不知道這對程序好不好,現在只是想到了實現),只要出現了最后一個item,就去執行綁定方法。
在頁面綁定中,需要
<ContentPage xmlns:common="clr-namespace:XXX.Common;assembly=XXX" > <common:InfiniteListView CanLoadMore="{Binding IsLoadMore}" LoadMoreCommand="{Binding LoadMoreLogCommand}"> </common:InfiniteListView>
So。。其實是不是很簡單?
簡單測試了一下,發現了一個問題。就是我的list數據,有分組,一個list里面可能會有多個list,那最后一個item豈不是永遠都是最外層的數據了?我把方法簡單的改了一下
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。