我想在我的应用程序中创建一个无限滚动的RecyclerView。它使用一个web服务,并在屏幕上带来一些CardView项目。下面是我到目前为止得到的简化代码,没有包含RecyclerView创建等。
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);
}
}
}目前,当滚动到最后一个项目时,我的滚动器被多次调用,所以它带来的项目比需要的多。我希望我的侦听器只被调用一次,获取项目,然后在新的最后一项可见时再次被调用。这与我现在的代码相符吗?谢谢。
发布于 2017-01-27 14:41:54
简单的答案是向侦听器添加一个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;
}
}
}https://stackoverflow.com/questions/41893380
复制相似问题