見出し画像

iOSエンジニアがAndroidアプリをリリースするまで5 〜リストでカスタムセル〜

リスト表示はアプリの基本。

編み物カウンターもアプリを起動したときに一番最初に表示されるのは、保存されたカウンターの一覧です。
今回はリスト表示を実装しました。

また、データの永続化にはRealmを使うので、リストはRealmRecyclerViewAdapterを使って実装。

参考にした本

以前の記事でも挙げたが、Androidを初めて勉強したとき、この本を使った。


一通り通読しながら写経して、Androidアプリの一連の流れだったり、基礎的なことを勉強しました。

この本に、Realmの読み書きやリスト表示、データ更新時のリストへの反映などが解説されていて、大変参考になりました。

RecyclerViewのadapterにRealmRecyclerViewAdapterのサブクラスをセットするのがポイント。
このAdapterがRealmに最適化されており、Realmの更新などをリストに反映させてくれるようです。

Realmの導入

Realmの導入は公式ドキュメントやqiitaなどにもたくさん記載されているのでさらっと。

プロジェクトのbuild.gradle

略
dependencies {
    略
    classpath "io.realm:realm-gradle-plugin:7.0.0"
}
略

appのbuild.gradle

略
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
略
dependencies {
    略
    implementation 'io.realm:android-adapters:3.1.0'
    略
}

「implementation 'io.realm:android-adapters:3.1.0'」でRealmRecyclerViewAdapterを使えるようにしています。

レイアウト

前述の入門書では、リストのセルのレイアウトは元から用意されているものを使用していました。

しかし、編み物カウンターではカスタムセルを使用します。

流れとしては、
1. レイアウトファイルでセルのレイアウトを作成する
2.RealmRecyclerViewAdapterのサブクラスのonCreateViewHolderで、1で作成したレイアウトを返す

以上です。

では詳しく。

1.レイアウトファイルでセルのレイアウトを作成する
File > New > XML > Layout XML File

リストの各セルの高さを、作成したXMLのルートのビューの高さ(layout_height)にセットします。
ビューの中身はお好きに。

2.RealmRecyclerViewAdapterのサブクラスのonCreateViewHolderで、1で作成したレイアウトを返す

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CounterListAdapter.ViewHolder {
    val inflater = LayoutInflater.from(parent.context)
    val view = inflater.inflate(R.layout.counter_list_cell, parent, false)
    return ViewHolder(view)
}

R.layout.counter_list_cellのところが1で作成したレイアウトを指定しているところです。

このセルをリストで表示するとこんな感じになります。

画像1


セル専用のViewのクラスがあるわけではない

iOSでリストを表示するときはUITableViewを使います。これがRecyclerViewに該当するものです。
UITableViewでリストを表示する場合、セルは必ずUITableViewCellのサブクラスとなります。
UITableViewでは大量データも表示できるように、各行ごとにセルを生成するのではなく、画面の広さ+α分のセルを生成して、スクロールに合わせて画面から外れたセルを使い回します。

なので、セルにセットし忘れたプロパティがあると、前のデータがそのまま残ってしまうなんてことがあります。

初めてこの事象に当たったとき、なんでこんなことになるのか本当にわからなかったです。。。


さて、話は戻って、AndroidのRecyclerView。

こちらはセル専用のViewクラスがあるわけじゃないんですね。

なんだか汎用性が高かったり、そのView専用のクラスではないから、覚えることが少なくていいですねw


参考記事
Realm Java


この記事が気に入ったらサポートをしてみませんか?