android - Xamarin Android onScrollListener 被多次调用

标签 android xamarin

我想在我的应用程序中创建一个无限滚动的 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);
        }
    }
}

目前,当向下滚动到最后一个项目时,我的滚动器被多次调用,因此它带来了比需要的更多的项目。 我希望我的监听器被调用一次,获取项目,然后当新的最后一个项目可见时能够再次调用。我当前的代码可以吗?谢谢。

最佳答案

简单的答案是向您的监听器添加一个 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;
        }
    }
}

关于android - Xamarin Android onScrollListener 被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41893380/

相关文章:

c# - Xamarin.IOS : Cannot Resolve Reference (System. 线程.Tasks.Extension.dll)

visual-studio - Xamarin.Forms Android 应用程序在启动时崩溃(仅在发布版本中)

c# - Xamarin Android 自定义线程类 block UI

objective-c - 库的所有代码都是用 Swift 编写的,但框架的 header 似乎是 Objective C?

android - 如何在 Android Things 上访问 HardwarePropertiesManager

java - 无法使用 Thread.interrupt 在 Android 上停止进度条

android - Gradle 同步失败 : Failed to update Android plugin to version '2.0.0'

youtube - 在 Xamarin 中播放 YouTube 视频

Android - EditText 以编程方式不显示键盘

java - 移动不受 FPS 影响的对象