2017-01-27 18 views
2

私のアプリケーションで無限のスクロールRecyclerViewを作成したいと思います。それはWebサービスを消費し、いくつかのCardViewアイテムを画面に表示します。ここで私がこれまで持っている単純化されたコードは、RecyclerView作成をinculdingせずに、あるだなどXamarin Android onScrollListenerが複数回呼び出されています

Main.cs

protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     var categoryLayoutManager = new LinearLayoutManager(this); 
     categoryList.SetLayoutManager(categoryLayoutManager); 
     var onScrollListener = new OnScrollListener(categoryLayoutManager); 

     onScrollListener.LoadMoreEvent += (object sender, EventArgs e) => 
     { 
      Console.WriteLine("Last"); 
     }; 
    } 

OnScrollListener.cs

public class OnScrollListener : RecyclerView.OnScrollListener 
{ 
    public delegate void LoadMoreEventHandler(object sender, EventArgs e); 
    public event LoadMoreEventHandler LoadMoreEvent; 

    private LinearLayoutManager LayoutManager; 

    public OnScrollListener(LinearLayoutManager layoutManager) 
    { 
     LayoutManager = layoutManager; 
    } 

    public override void OnScrolled(RecyclerView recyclerView, int dx, int dy) 
    { 
     base.OnScrolled(recyclerView, dx, dy); 

     var visibleItemCount = recyclerView.ChildCount; 
     var totalItemCount = recyclerView.GetAdapter().ItemCount; 
     var pastVisiblesItems = LayoutManager.FindFirstVisibleItemPosition(); 

     if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 
     { 
      LoadMoreEvent(this, null); 
     } 
    } 
} 
現在

、スクロールダウン最後の項目まで、私のスクロールバーは複数回呼び出されるので、必要以上に多くの項目が表示されます。 Listenerを一度呼び出すと、アイテムを取得してから、新しい最後のアイテムが表示されたときに再び呼び出すことができます。私は持っている現在のコードとposibleですか?ありがとうございました。

答えて

1

単純な答えは、IsLoadingプロパティをリスナーに追加し、何かがロードされていない場合にのみロードします。あなたのケースでどのように見えるかを考えてみましょう。

public class OnScrollListener : RecyclerView.OnScrollListener 
{ 
    public delegate void LoadMoreEventHandler(object sender, EventArgs e); 
    public event LoadMoreEventHandler LoadMoreEvent; 
    public bool IsLoading { get; set; } 
    private LinearLayoutManager LayoutManager; 

    public OnScrollListener(LinearLayoutManager layoutManager) 
    { 
     LayoutManager = layoutManager; 
    } 

    public override void OnScrolled(RecyclerView recyclerView, int dx, int dy) 
    { 
     base.OnScrolled(recyclerView, dx, dy); 

     var visibleItemCount = recyclerView.ChildCount; 
     var totalItemCount = recyclerView.GetAdapter().ItemCount; 
     var pastVisiblesItems = LayoutManager.FindFirstVisibleItemPosition(); 

     if ((visibleItemCount + pastVisiblesItems) >= totalItemCount && !IsLoading) 
     { 
      IsLoading = true; 
      LoadMoreEvent(this, null); 

      // after it's done, set it back to false 
      IsLoading = false; 
     } 
    } 
} 
関連する問題