2017-03-29 71 views
1

的問題Xamarin.Forms ListView控件加載更多

我想實現你能基本上在這裏看到

enter image description here

什麼,所以當用戶滾動到最後,我要加載更多,因爲我的列表非常龐大,我想要最大化性能。

我試圖做到這一點如下,與數據分割的主要收藏,這樣我可以設置的ItemSource新當用戶到達終點。

香港專業教育學院迄今

public class ViewModel : BaseViewModel { 

     public ViewModel() { 
      Initialize(); 
     } 

     public List<List<Usermodel>> SplitedUserLists { get; set; } 

     //Main List that im Binding to 
     public List<Usermodel> ItemSourceCollection { get; set; } 

     public int ChunkSize { get; set; } 
     #endregion 

     private async void Initialize() { 

      ItemSourceCollection = await LoadList(); 

      // Splites the list (in this case the chunk Size is 5) 
      SplitedScoreLists = ItemSourceCollection.Split(GetChunkSize())); 
      ItemSourceCollection = SplitedScoreLists[0]; 
     } 

     //Gets called from CodeBehind 
     public void ListViewItemAppearing(ItemVisibilityEventArgs e) { 

      //Bottom Hit! 
      if (e.Item == ItemSourceCollection[ItemSourceCollection.Count - 1]) { 

       if (ChunkSize >= SplitedScoreLists.Count) { 
        return; 
       } 

       foreach (var usermodel in SplitedScoreLists[ChunkSize].ToList()) { 
        ItemSourceCollection.Add(usermodel); 
       } 

       if (ChunkSize < SplitedScoreLists.Count) { 
        ChunkSize++; 
       } 
      } 
     } 
} 

問題執行哪些

  1. 我的執行的問題是,該名單實際上長於原始列表伯爵由於重複。

  2. 這樣就可以達到這樣的事情的正確方法?

  3. 上午我實際增加有此表現?我需要導致列表是1000+條目。

+0

我會懷疑這是否會提高性能,除非加載每個數據塊相當昂貴。相反,我會一次加載它,並使用搜索框和跳轉列表來允許用戶瀏覽列表。 – Jason

+0

我一次加載它們,只是試圖不要一次顯示它們。也許用戶並不需要他們全部。 –

+0

作爲一個用戶,我會發現,真的很煩人 – Jason

回答

3

有關於如何實現這一美好教程:

http://motzcod.es/post/107620279512/load-more-items-at-end-of-listview-in

https://github.com/jguibault/Xamarin-Forms-Infinite-Scroll

http://www.codenutz.com/lac09-xamarin-forms-infinite-scrolling-listview/

的關鍵點是何時提出的 「加載更多」 命令:

public class InfiniteListView : ListView 
{ 
    public static readonly BindableProperty LoadMoreCommandProperty = BindableProperty.Create<InfiniteListView, ICommand>(bp => bp.LoadMoreCommand, default(ICommand)); 

    public ICommand LoadMoreCommand 
    { 
     get { return (ICommand) GetValue(LoadMoreCommandProperty); } 
     set { SetValue(LoadMoreCommandProperty, value); } 
    } 

    public InfiniteListView() 
    { 
     ItemAppearing += InfiniteListView_ItemAppearing; 
    } 

    void InfiniteListView_ItemAppearing(object sender, ItemVisibilityEventArgs e) 
    { 
     var items = ItemsSource as IList; 

     if (items != null && e.Item == items[items.Count - 1]) 
     { 
      if(LoadMoreCommand != null && LoadMoreCommand.CanExecute(null)) 
       LoadMoreCommand.Execute(null); 
     } 
    } 
}