1

カスタム アダプターを使用して 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 をスムーズにスクロールできるように数日間取り組んできましたが、私が見つけた提案はどれも違いを生んだり、正しく機能したりするようには見えません。

4

1 に答える 1

2

うわー...わかりました、これを解決しました。

この投稿に次のようなコメントがありました。

MvxListView の OnScrollListener の実装

Cheesebaron によって...そしてそれは動作します。

これが私の変更されたコードです:

            _caseTable.ScrollStateChanged += (o, e) =>
                                                 {
                                                     var adapter = (CaseListAdapter)_caseTable.Adapter;
                                                     if (e.ScrollState != ScrollState.Idle)
                                                     {
                                                         adapter.IsScrolling = true;
                                                     }
                                                     else
                                                     {
                                                         adapter.IsScrolling = false;
                                                         adapter.NotifyDataSetChanged();
                                                     }
                                                 };
于 2013-08-19T14:45:47.987 に答える