問題点1, そもそもRecyclerViewのWidth/Heightが0dpである
- デフォルトのvisibilityがGONEの場合、VISIBLEに切り替えてもレイアウトのサイズが再計算されない
- GONEではなく、INVISIBLEを使うことでレイアウトのサイズが計算される
問題点2, adapterをsetしてもinvalidateしてもコンテンツ数がいくつあっても再描画されない
- メインの問題
- notifyDatasetChangedとかinsertとかdeleteとか考えつく限りのイベント通知をしたけどダメ
- setLayoutParamsとかしなおしたけどダメ
- invalidate()とかしたけどダメ
- RecyclerViewには
dispatchLayout()
という描画開始を行うためのpackage privateメソッドがある
- それがコールされないらしい
- 描画効率のため、いろんな判定が入ってるけどどこかに不具合があるんかな?
- リフレクション使って、adapterをセットした直後とか、強制描画したいタイミングでコールしてあげると描画される
// こんなふうにするといい
fun RecyclerView.forceDispatchLayout() {
val method = RecyclerView::class.java.getDeclaredMethod("dispatchLayout")
method.isAccessible = true
method.invoke(this)
}
謎