どうも。どっことです。今回はListView
に追加読み込みする機能を実装する方法について解説します。
追加読み込み機能を持つListView
またまた、いにしえのListView
に関する解説です。RecyclerView
はカスタマイズ性に長けていますが、「単に一覧で表示してくれればいい」程度であれば、シンプル実装できるListViewもまだまだ使い道のあるコンポーネントかと思います。今回はそんなListViewで、追加読み込みをする機能の実装について解説しようと思います。
追加読み込みListViewを実装する
実装手順は以下の通りです。
- 読み込み表示Viewを実装する
- 読み込み表示Viewを表示する
- 読み込み処理タイミングを検知する
順番に解説していきます。
読み込み表示Viewを実装する
まずは読み込み表示用のViewを実装します。一般的にはプログレスを表示する形かと思いますので、そのViewを用意しておきます。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp">
<ProgressBar
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
読み込み表示Viewを表示する
次に読み込み表示用Viewの表示処理を実装します。ListViewにはFooterView
としてViewを追加することができるので、ここに読み込み表示Viewを設定します。
listView.addFooterView(createFooterView())
fun createFooterView(): View {
return layoutInflater.inflate(R.layout.view_progress, null)
}
読み込み処理タイミングを検知する
読み込み処理を実装します。OnScrollListener#onScroll
を使って、スクロールが最下部に来た時を検知し、読み込み処理を実施します。
listView.setOnScrollListener(object : OnScrollListener {
override fun onScrollStateChanged(view: AbsListView?, scrollState: Int) {
// ここでは気にしない
}
override fun onScroll(view: AbsListView?, firstVisibleItem: Int,visibleItemCount: Int, totalItemCount: Int) {
if (totalItemCount == firstVisibleItem + visibleItemCount) {
// todo:すべての要素が表示されたので、追加読み込みを処理する
}
}
}
onScrollStateChanged
が気になる人は、判定処理をあらかじめ実装したinterfaceを定義して、そちらを渡すような実装としても良いかもしれません。
interface OnBottomScrolledListener : OnScrollListener {
/**
* 最下部までスクロールされたことを検知
**/
fun onScrolledToBottom()
override fun onScrollStateChanged(view: AbsListView?, scrollState: Int) {
// ここでは気にしない
}
override fun onScroll(view: AbsListView?, firstVisibleItem: Int, visibleItemCount: Int, totalItemCount: Int) {
if (totalItemCount == firstVisibleItem + visibleItemCount) {
onScrolledToBottom()
}
}
}
listView.setOnScrollListener(object : OnBottomScrolledListener {
override fun onScrolledToBottom() {
// 最下部までスクロールされたことを検知したので、追加読み込みする
}
}
また「読み込んだ結果、追加分が0件だった」場合に再度読み込み処理が実施されないよう、フラグなどでの管理も入れておきます。
listView.setOnScrollListener(object : OnBottomScrolledListener {
override fun onScrolledToBottom() {
if (!isLoadNecessary) {
// 何もせず終了
// このタイミングで読み込み表示Viewも消しておきましょう
listView.addFooterView(null)
return
}
// 最下部までスクロールされたことを検知したので、追加読み込みする
}
}
まとめ
今回は下スクロールしたら追加読み込みしてくれるListViewについて解説しました。前回の解説でもコメントしましたが、RecyclerViewの登場によりListViewはもはやいにしえのコンポーネントとなっていますが、やはり初期装備が揃ってくれているおかげで実装が簡単という点がAndroidエンジニア初心者には優しいですね。