【问题标题】:Xamarin.Android: ListView IOnScrollListener not firing OnScrollStateChangedXamarin.Android:ListView IOnScrollListener 未触发 OnScrollStateChanged
【发布时间】:2013-08-19 14:16:12
【问题描述】:

我已经使用自定义适配器在我的 ListView 上实现了滚动监听器。这个想法是,如果列表正在滚动,我不会加载需要更多思考时间的数据(例如检查本地 SQLite DB 上可能存在的大表)

我的监听器代码如下:

    public class ScrollListener : AbsListView.IOnScrollListener
    {
        private readonly ListView _list;

        public ScrollListener(ListView list)
        {
            _list = list;
        }

        #region Implementation of IDisposable

        public void Dispose()
        {
        }

        #endregion

        #region Implementation of IJavaObject

        public IntPtr Handle { get; private set; }

        #endregion

        #region Implementation of IOnScrollListener

        public void OnScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
        {
        }

        public void OnScrollStateChanged(AbsListView view, ScrollState scrollState)
        {
            var adapter = (CaseListAdapter) _list.Adapter;
            if (scrollState != ScrollState.Idle)
            {
                adapter.IsScrolling = true;
            }
            else
            {
                adapter.IsScrolling = false;
                adapter.NotifyDataSetChanged();
            }
        }

        #endregion
    }

然后我将其设置为:

_caseTable.SetOnScrollListener(new ScrollListener(_caseTable));

这个对象肯定是在这里创建的,但由于某种原因,当我开始或停止滚动时,根本没有调用 OnScrollStateChanged 方法。

我是否在这里遗漏了一些明显的东西,或者有没有更好的方法来检查列表是否正在滚动?几天来,我一直在努力让这个 ListView 顺利滚动,但我发现的任何建议似乎都没有任何作用,甚至无法正常工作。

【问题讨论】:

    标签: android-listview xamarin.android smooth-scrolling


    【解决方案1】:

    哇...好的,解决了这个问题。

    我在这篇文章上看到了一条评论:

    implementing OnScrollListener for MvxListView

    由 Cheesebaron... 并且有效。

    这是我修改后的代码:

                _caseTable.ScrollStateChanged += (o, e) =>
                                                     {
                                                         var adapter = (CaseListAdapter)_caseTable.Adapter;
                                                         if (e.ScrollState != ScrollState.Idle)
                                                         {
                                                             adapter.IsScrolling = true;
                                                         }
                                                         else
                                                         {
                                                             adapter.IsScrolling = false;
                                                             adapter.NotifyDataSetChanged();
                                                         }
                                                     };
    

    【讨论】:

    • 酷。顺便一提。当您实现 Android 接口并要求您实现 IntPtr 时,您需要从 Java.Lang.Object 继承,这样就完全不需要了。
    • Cheesebagon 应该添加这个答案,他应该是选择的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2020-11-26
    相关资源
    最近更新 更多