2017-01-27 2 views
2

Я хочу создать бесконечное прокручивание RecyclerView в моем приложении. Он использует веб-службу и отображает некоторые элементы 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; 
     } 
    } 
} 
Смежные вопросы