2017-01-27 25 views
2

我想在我的應用程序中創建一個無限的滾動RecyclerView。它使用Web服務並在屏幕上顯示一些CardView項目。這裏的是簡化代碼,我到目前爲止,沒有inculding的RecyclerView創作等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); 
     } 
    } 
} 

目前,向下滾動時到最後一個項目,我的滾動器不止一次地被調用,所以它帶來了比需要更多的項目。 我希望我的偵聽器被調用一次,獲取項目,然後能夠在新的最後一個項目可見時再次調用。現在的代碼有可用嗎?謝謝。

回答

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; 
     } 
    } 
}