PS:数日前に用事があり、大学の近くを通りかかったので、わざわざ中に入ってみました。馴染みのある風景に馴染みのない人々、数年ぶりに、もう戻れないのです。
まずはこのプロジェクトの作者の紹介を見てみましょう。MultiType は、複数のタイプのリストビューの中間配信フレームワークであり、複雑なリストページを迅速かつ明確に開発するのに役立ちます。データ駆動のビューをサポートし、レイアウトタイプと viewBinder の一対一および一対多の関係バインディング、インターフェース指向プログラミングをサポートします。MultiType は、ビューの作成とデータの充填の作業を ItemViewBinder に委任しています。ItemViewBinder は、充填するデータタイプ T と ViewHolder に対応しており、今後異なるデータタイプはそれぞれ対応する ItemViewBinder を実装する必要があります。プロジェクトのアドレスは以下の通りです:
以下のいくつかの側面から MultiType のソースコードを学びます:
- MultiTypeAdapter の使用
- MultiTypeAdapter の register プロセス
- MultiTypeAdapter の ViewHolder とデータ充填
MultiTypeAdapter の使用#
MultiTypeAdapter の書き方が通常の Adapter とどのように異なるかを簡単に見てみましょう。以下の通りです:
// base
adapter.register(TextItemViewDelegate())
adapter.register(ImageItemViewDelegate())
adapter.register(RichItemViewDelegate())
// One to many
adapter.register(Data::class).to(
DataType1ViewDelegate(),
DataType2ViewDelegate()
).withKotlinClassLinker { _, data ->
when (data.type) {
Data.TYPE_2 -> DataType2ViewDelegate::class
else -> DataType1ViewDelegate::class
}
}
adapter.items = items
recyclerView.adapter = adapter
adapter.notifyDataSetChanged()
具体的な詳細についてはここでは繰り返しません。具体的には前のアドレスを参照してください。
MultiTypeAdapter の register プロセス#
MultiTypeAdapter の register プロセスは、Type タイプを MultiTypeAdapter に対応するコレクションに追加し、後で使用できるようにすることです。呼び出しプロセスは以下の通りです:
次に、MultiTypeAdapter の一対多関係の register プロセスを見てみましょう:
上記の第 10 ステップでは、一対一の登録プロセスに戻っています。
MultiTypeAdapter の ViewHolder とデータ充填#
前の小節では、MultiTypeAdapter は元々RecyclerView.Adapter のいくつかのメソッドを ItemViewBinder の具体的なサブクラスの実装に委任し、具体的な ItemViewBinder、Linker、データタイプ T の Class 情報を Type の形式で MultiTypeAdapter のタイプコレクションに追加しました。その Item タイプ、ViewHolder の作成、データの充填はすべて具体的な ItemViewBinder のサブクラスの実装を通じて行う必要があります。以下ではこのプロセスを詳しく探求します。
getItemViewType#
getItemViewType は Item のビュータイプを返すために使用されます。MultiTypeAdapter の getItemViewType が返すビュータイプのインデックスは MutableTypes の対応する Type のインデックスです。呼び出しプロセスは以下の通りです:
上記から、最終的に返されるビュータイプのインデックスは index+linker.index であり、ソースコードから一対一の状況では DefaultLinker が使用され、そのデフォルトの index は 0 であるため、最終的に返されるビュータイプのインデックスは MutableTypes の対応する Type のインデックス index です。
onCreateViewHolder#
onCreateViewHolder はレイアウトファイルに基づいて ViewHolder を生成するために使用されます。具体的な呼び出しプロセスは以下の通りです:
onBindViewHolder#
onBindViewHolder も同様に、追加されたタイプのコレクションから対応する委任の ItemViewDelete を取得して処理します。
簡単にまとめると、上記の使用方法は、元の Recycler.Adapter のいくつかのメソッドを ItemViewDelegate に委任し、各 Item タイプを MutableTypes のタイプコレクション types に追加し、具体的な実装は委任された具体的な実装クラスから完了します。
まとめ#
簡単にまとめると、表示される Item のタイプを ItemViewBinder の方法で抽出し、異なる Item のタイプ間の結合を減少させました。これにより、Adapter を変更することなく、いつでも Item のタイプを追加できるようになり、新しい ItemViewBinder の実装クラスを追加するだけで済みます。
著者が言及した「一対多」の関係は、同じ Item のタイプが複数のレイアウト実装に対応することを指し、主に著者のコードの考え方を学ぶことを目的としています。個人的には、MultiTypeAdapter は RecyclerView.Adapter の拡張であり、封装ではないと理解しています。自分で使用する場合は、さらに封装することができます。