SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門

大量データを効率よく表示できる「ページングライブラリ」を解説

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門 第12回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Javaでのページングライブラリの利用

 一通りRoom+ページングライブラリをKotlinでコーディングする方法を紹介したところで、Javaでのコーディングに話を移しましょう。なお、PhoneDAOインターフェース、Phoneエンティティクラス、リポジトリクラスともに、KotlinコードをJavaコードに置き換えただけのコードなので割愛します。

JavaではLiveDataを利用

 一番大きな違いは、JavaではFlowの代わりにLiveDataを利用する点です。そのため、Kotlinでは、Flowを抽出していたViewModel内のコードが変わってきます。これは、リスト9のコードとなります。

[リスト9]ViewModelクラス(Java版)
public class MainViewModel extends AndroidViewModel {
  private static final int ITEMS_PER_PAGE = 50;  // (1)
  private PhoneRepository _phoneRepository;
  private LiveData<PagingData<Phone>> _phoneListLiveData;  // (2)

  public MainViewModel(@NonNull Application application) {
    super(application);
    _phoneRepository = new PhoneRepository(application);

    PagingSource<Integer, Phone> phoneListPageSource = _phoneRepository.getAllPhoneListPagingSource();  // (3)
    PagingConfig pagingConfig = new PagingConfig(ITEMS_PER_PAGE);  // (4)
    Pager<Integer, Phone> phoneListPager = new Pager<>(pagingConfig, () -> phoneListPageSource);  // (5)
    CoroutineScope viewModelScope = ViewModelKt.getViewModelScope(MainViewModel.this);  // (7)
    _phoneListLiveData = PagingLiveData.cachedIn(PagingLiveData.getLiveData(phoneListPager), viewModelScope);  // (8)
  }

  public LiveData<PagingData<Phone>> getPhoneListLiveData() {
    return _phoneListLiveData;
  }
}

 リスト9の(1)(3)(4)(5)は、リスト5のそれぞれに対応するKotlinコードをJavaコードに置き換えただけのコードとなっています。一番の違いは(2)のフィールドの型がLiveDataとなっていることです。JavaではFlowが使えないため、当然です。それに伴い、このLiveDataを抽出するコードも(8)のように変わります。もともとKotlin用に作られたページングライブラリなので、内部のFlowオブジェクトをLiveDataに変換するクラスとしてPagingLiveDataが別に用意されています。そのstaticメソッドであるgetLiveData()を利用し、LiveDataを抽出します。さらに、同じくcachedIn()メソッドを利用して、抽出したLiveDataに対して、リスト5の(6)で行ったcachedIn()メソッドと同様の効果を施します。

 getLiveData()メソッドは、引数としてPagerオブジェクトを渡すので、(8)では(5)で生成したphoneListPagerを渡しています。そのようにして抽出したLiveDataをcachedIn()の第1引数とします。一方、cachedIn()の第2引数は、コルーチンスコープを渡すことになっています。Javaには、このコルーチンスコープという概念がないので、これもKotlin由来の専用クラスであるViewModelKtのstaticメソッド、getViewModelScope()メソッドを利用して取得します。それが(7)のコードです。

オブザーバの用意

 Javaでは、ページデータがFlowではなくLiveDataとなることで、アクティビティやフラグメントでのRecyclerViewとの連携もコードも変わってきます。

 まず、アダプタクラスであるPhoneListAdapterやDiffUtil.ItemCallbackクラスであるPhoneComparatorは、KotlinコードをそのままJavaコードに変換したものとなるので、割愛します。一方、アダプタクラスのsubmitData()の実行コードが変わってきます。これはリスト10のように、オブザーバクラス内となります。

[リスト10]MainActivityでの連携コード(Java版)
@Override
protected void onCreate(Bundle savedInstanceState) {
  :
  LiveData<PagingData<Phone>> phoneListLiveData = _mainViewModel.getPhoneListLiveData();
  phoneListLiveData.observe(MainActivity.this, new PhoneListObserver());  // (1)
}
private class PhoneListObserver implements Observer<PagingData<Phone>> {  // (2)
  @Override
  public void onChanged(<PagingData<Phone>> phonePagingData) {
    _phoneListAdapter.submitData(getLifecycle(), phonePagingData);  // (3)
  }
}

 リスト10の(1)のように、ViewModelから取得したLiveDataに対してオブザーバを登録します。そのオブザーバクラスが(2)のPhoneListObserverであり、そのメソッドonChanged()内でアダプタのsubmitData()を実行します。ただし、Kotlinコードとは違い、(3)のように、引数が2個必要です。順番は前後しますが、第2引数は、KotlinコードでのsubmitData()の実行同様に、新しいデータです。したがって、onChanged()の引数をそのまま渡します。一方、第1引数がKotlinコードにはなく、ライフサイクルを渡す必要があります。これは、getLifecycle()メソッドの戻り値を渡します。

まとめ

 Android Jetpackについて紹介していく本連載の第12回は、いかがでしたでしょうか。

 今回は、ページングライブラリの基礎的な使い方を紹介しました。次回は、ページングライブラリをもう少し掘り下げ、PagingSourceクラスの自作方法やネット上のデータとRoomを連携させてページングする方法を紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20372 2024/10/28 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング