Xamarin.Android:ListView IOnScrollListener未触发OnScrollStateChanged

时间:2013-08-19 14:16:12

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

我在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顺利滚动几天,我找到的建议似乎没有任何差别,甚至无法正常工作。

1 个答案:

答案 0 :(得分: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();
                                                     }
                                                 };