Posted at

RecyclerViewのViewTypeをlayoutIdにしていると起きること

More than 1 year has passed since last update.

大したことではないんですが、自分の中で1つの教訓となったので


状況

プロジェクトにこんなコードがありました。

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

return when (viewType) {
RecyclerItemViewType.PROGRESS_BAR-> {
ProgressBarViewHolder(layoutInflater.inflate(viewType, parent, false))
}
else -> {
HViewHolder(parent, viewType)
}
}
}

ここの LayoutInflater::inflate() の第一引数は layoutId になってますよね。

このコードではViewTypeとlayoutIdがイコールになってます。つまり

public static final int PROGRESS_BAR= R.layout.recycler_item_progress_bar;

layoutIdをViewTypeとして使う固定値に突っ込んでます。

特にこれでも問題なく動くんです。確かに同一にしてると楽なときはたくさんあるし便利なときも多い。上記のように onCreateViewHolder()viewType をそのまま layoutId として突っ込めばいいし。。

でも個人的にはなにか気持ち悪い。問題ないのかなとずっと思っていたんです。


なにか起きた。

といっても問題ではないです。

コード書き換えて実行していたときにヌルポが発生したりしました。

よくよく見ていくと先程の PROGRESS_BAR のIDが変わっていてonCreateViewHolder()のviewType分岐をすり抜けた模様。


つまり

新機能開発とbugfixのBranchを切り替えてビルドしての間にlayoutIdが変わったものと思われます。

クリーンビルドしたら直った。こういうのが 「なんだかわからないけどクリーンしたら直った」 につながっているのだと思います。今回はちょうど理解できたからいいですが、これが積み重なると「よくわかないときはクリーンしとけ」という神話になっていくのかなと。

個人的には便利なのでつかってもいいかなと考えてます。しかし、上記の前提を踏まえた上で。

以上、メモでした。