【Android】ListViewで最終行までスクロールしたことを判定する

ListViewにデータの一部を表示し、最終行までスクロールした際に追加で読み込み処理を入れたいときに判定するためのロジックです。

以前作成した ListViewアプリケーション がありますので、これを使って最終行までスクロールしたときに処理を入れてみたいと思います。

https://www.s-watanabe.work/2020/12/androidcheckbox.html

実装

方法としてはsetOnScrollListenerのonScrollメソッド内で引数の値を確認して判定します。onScrollメソッドの引数は以下です。

  1. AbsListView absListView - スクロール中のView (今回は使用しない)
  2. int firstVisibleItem - 先頭のindex
  3. int visibleItemCount - 見えている件数
  4. int totalItemCount - ListViewのItem総件数

※公式ドキュメントは以下です。

https://developer.android.com/reference/android/widget/AbsListView.OnScrollListener#public-methods_1

onScrollメソッドで最終行まで到達したことを判定する

    // メンバー変数
    Boolean isLastLine = false;

    (省略)

    listView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int i) {
            //
        }

        @Override
        public void onScroll(AbsListView absListView,
                             int firstVisibleItem,
                             int visibleItemCount,
                             int totalItemCount) {

            if (isLastLine) {
                isLastLine = (totalItemCount == firstVisibleItem + visibleItemCount);
            } else {
                isLastLine = (totalItemCount == firstVisibleItem + visibleItemCount);
                if (isLastLine) {
                   Toast.makeText(MainActivity.this, "最終行", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });

ListViewに表示されている先頭のItemと現在表示中のItem数を足したものが、ListViewの総件数と一致することで最終行であることを判定しています。

また、onScrollはスクロール中何度も呼ばれるので、最終行にいる間は呼ばれないようにメンバー変数isLastLineで制御しています。

動作確認

ソースコードの全体は以下です。

https://github.com/s-watanabe-apps/listview-test/blob/master/app/src/main/java/com/swapps/listviewtest/MainActivity.java

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)