首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin Android onScrollListener被多次调用。

Xamarin Android onScrollListener被多次调用。
EN

Stack Overflow用户
提问于 2017-01-27 11:52:44
回答 1查看 1.8K关注 0票数 2

我想在我的应用程序中创建一个无限滚动的RecyclerView。它使用一个web服务,并在屏幕上带来一些CardView项目。下面是我到目前为止得到的简化代码,没有包含RecyclerView创建等。

Main.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
        }
    }
}

目前,当滚动到最后一个项目时,我的滚动器被多次调用,所以它带来的项目比需要的多。我希望我的侦听器只被调用一次,获取项目,然后在新的最后一项可见时再次被调用。这与我现在的代码相符吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-27 14:41:54

简单的答案是向侦听器添加一个IsLoading属性,然后只有当它还没有加载时才加载。这里有一个想法,在你的情况下它可能是什么样子

代码语言:javascript
复制
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;
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41893380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档