RecyclerView.Adapter の onBindViewHolder ではViewType判別に「getItemViewType」と「holderをinstanceofで判定」のどちらを用いるのが良いか (Android)


AndroidのRecyclerView.Adapterの実装において、2種類以上のViewTypeを扱う場合には `onBindViewHolder`
の実装内で場合分けをする必要があると思っています。

一般的なサンプルコードでは、たとえば以下のような実装が成されていると認識しています:

[code]

    // in Kotlin
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        when (getItemViewType(position)) {
            VIEW_TYPE_MY_STANDARD -> {
                (holder as MyStandardViewHolder) // do something
            }
            VIEW_TYPE_MY_SUB -> {
                (holder as MySubViewHolder) // do something
            }
            else -> throw IllegalStateException()
        }
    }
    
[/code]

対しチームメンバーのコードが、以下のようになっておりました:

[code]

    // in Kotlin
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        when (holder) {
            is MyStandardViewHolder -> {
                // do something
            }
            is MySubViewHolder -> {
                // do something
            }
            else -> throw IllegalStateException()
        }
    }
    
[/code]

このコードは、少なくともプロジェクト内では期待どおりの挙動であることを確認しています。

もし何か想定外の動作をする可能性があればエッジケース含め認識しておきたいと思っているのですが、何か起こりうる問題はありますでしょうか？  
また問題が起こり得なければ、そのまま後者のコードを採用したいです。




viewTypeとViewHolderの定義が1対1の対応となっているならば、後者のコードで問題ないと思います。

あまり考えにくいですが、1つのViewHolderに対しviewTypeが複数定義されている場合などは問題になりうるかもしれません。（同じレイアウトだけどどうしてもViewを使い回しさせたくない場合とか）




viewTypeとViewHolderの定義が1対1の対応となっているならば、後者のコードで問題ないと思います。

あまり考えにくいですが、1つのViewHolderに対しviewTypeが複数定義されている場合などは問題になりうるかもしれません。（同じレイアウトだけどどうしてもViewを使い回しさせたくない場合とか）

