2017-03-29 2 views
1

問題Xamarin.Formsリストビューロードより

私はよりロードする際にユーザーがスクロール最後に私が達成したいあなたは、基本的にはそうここ

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. これで実際にパフォーマンスが向上しますか?私はリストが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); 
     } 
    } 
}