画面スクロールしながらデータをロードする2016年11月27日(編集2016年11月27日)TweetAndroidアプリで一覧データのUI(ユーザーインターフェース)を作成する場合は、ListViewかRecyclerViewを使います。この記事は、RecyclerViewで画面スクロール中にデータをロードする方法を記載した記事です。中級者向けサンプルコードAndroid-RecyclerView-DemoRecyclerViewRecyclerViewは一覧表示の実装に利用するクラスです。ListViewを使うより、表現力のある、柔軟なユーザーインターフェースを作成できます。今回の記事で説明をする画面スクロールしながらのデータロードは、一覧表示の実装を理解している必要があります。理解不足の場合、まずはこちらの記事を読んで理解してください。app実装RecyclerViewの一覧実装にスクロール処理を実装します。ActivityやRecyclerView.Adapterの変更は不要です。詳しく内容を見ていきましょう。画面スクロールロードに必要な変数を定義します。20;offsetは現在リストに保持しているデータの総数です。データロードごとに増加していきます。sqlのoffsetと同じ意味です。autoScrollPositionはデータロードを実行するデータの位置です。スクロール下部のデータの位置になります。isLoadingはデータロード中はtrueに変更します。それ以外はfalseです。DEFAULT_OFFSETは1回のスクロールごとに追加するデータの数です。sqlのlimitと同じです。スクロール実装RecyclerViewでスクロールの挙動を実装する場合は、addOnScrollListenerメソッドを使用します。}});addOnScrollListenerメソッドの引数にOnScrollListenerの匿名クラスを設定します。LinearLayoutManagerクラスのrecyclerView.getChildCount()は現在画面に見えているアイテムの数を取得します。app画面にデータが10件表示されています。recyclerView.getChildCount()の値をconsoleに出力してみます。10画面のデータ表示件数が取得できました。manager.findFirstVisibleItemPosition()は、画面表示項目の最初のindex値を返します。consoleに出力して確認します。3画面表示項目の最初のindex値が取得できました。この2つの値を加算することで、現在一番画面下に表示されているデータのindex情報が取得できます。visibleItemCount;lastInScreenの値が、データロードを実行するデータの位置のautoScrollPositionと同じ値になった時に、次のデータ取得処理を行います。true;}autoScrollPositionは、データロードを実行するデータの位置です。autoScrollPositionになります。ロード処理が1度だけ呼ばれるように、ガード条件が必要です。load();}isLoadingがガード条件になります。isLoadingがtrueの間は、load処理は呼び出されません。データ追加RecyclerViewで追加処理を実装する場合は、RecyclerView.AdapterクラスのnotifyItemRangeInsertedメソッドを使用します。false;}notifyItemRangeInsertedの第1引数は開始ポジションです。list.size()で取得する値が次のindexの開始位置になります。items.size());第2引数は、追加するアイテム数です。これはsqlやネットワークから取得した追加のリストの数を設定します。最後に、次のスクロールロードのために変数を更新します。offsetに現在のアイテム数を設定します。list.size()の数を設定します。autoScrollPositionは次のスクロールポジションです。ロードで取得するデータ件数を追加します。isLoadingはガード条件です。falseにしてロード可能の状態にします。ビルド上記のコードの動作を確認してみましょう。appスクロールでデータが取得可能になりました。実装のポイント実装のポイントは、onScrolledメソッドの処理です。onScrolledメソッドは、画面を少しでも動かすと呼び出されるので、ガード条件の変数を使って1度だけ呼び出されるようにする必要があります。結論ListViewで、スクロールロードを実装したことがある人なら、それほど苦も無く実装できるはずです。一方で、初心者の場合は相当苦労すると思うので、開発工数には余力を持ちましょう。