Android Kotlin基礎講座 07.5:RecyclerViewのヘッダー

タスク:リスト操作にコルーチンを使う

このアプリには修正すべき点が2つあります。一つは見える部分で、もう一つは内部の見えない部分です。

  • ヘッダーが左上の角に表示されていますが、それだと区別がしづらいです。
  • 一つしかヘッダーがない小さなリストであれば、それはさほど問題ではありませんが、それとは別にUIスレッド上でaddHeaderAndSubmitList()によるリスト操作を行うべきではありません。100以上のアイテムがあり、複数のヘッダーを持ち、どこにアイテムが挿入されるべきかを決めるロジックをもつリストを想像してみてください。この処理はコルーチンに属します。

addHeaderAndSubmitList()をコルーチンを使うように変更します。

  1. SleepNightAdapterクラス内のトップレベルで、Dispatchers.Defaultを用いてCoroutineScopeを定義してください。
private val adapterScope = CoroutineScope(Dispatchers.Default)
  1. addHeaderAndSubmitList()内で、リストを操作するためにadapterScope内でコルーチンを起動してください。その後、リストをサブミットするためにDispatchers.Mainに切り替えます。以下のようになります。
fun addHeaderAndSubmitList(list: List<SleepNight>?) {
        adapterScope.launch {
            val items = when (list) {
                null -> listOf(DataItem.Header)
                else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
            }
            withContext(Dispatchers.Main) {
                submitList(items)
            }
        }
    }
  1. コードはエラーなくビルドできるはずです。一見アプリに違いは見られません。