/** * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.android.healthconnect.controller.shared.recyclerview import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView /** * {@link RecyclerView.Adapter} that handles binding objects of different classes to a corresponding * {@link View}. */ class RecyclerViewAdapter private constructor( private val itemClassToItemViewTypeMap: Map, Int>, private val itemViewTypeToViewBinderMap: Map> ) : RecyclerView.Adapter() { class Builder { companion object { // Base item view type to use when setting a view binder for objects of a specific class private const val BASE_ITEM_VIEW_TYPE = 100 } private var nextItemType = BASE_ITEM_VIEW_TYPE private val itemClassToItemViewTypeMap: MutableMap, Int> = mutableMapOf() private val itemViewTypeToViewBinderMap: MutableMap> = mutableMapOf() fun setViewBinder(clazz: Class, viewBinder: ViewBinder): Builder { itemClassToItemViewTypeMap[clazz] = nextItemType itemViewTypeToViewBinderMap[nextItemType] = viewBinder nextItemType++ return this } fun build() = RecyclerViewAdapter(itemClassToItemViewTypeMap, itemViewTypeToViewBinderMap) } class ViewHolder(view: View) : RecyclerView.ViewHolder(view) private var data: List = emptyList() fun updateData(entries: List) { this.data = entries notifyDataSetChanged() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val viewBinder = checkNotNull(itemViewTypeToViewBinderMap[viewType]) return ViewHolder(viewBinder.newView(parent)) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val viewBinder: ViewBinder = checkNotNull(itemViewTypeToViewBinderMap[getItemViewType(position)]) as ViewBinder val item = data[position] viewBinder.bind(holder.itemView, item, position) } override fun getItemViewType(position: Int): Int { val clazz = data[position].javaClass return checkNotNull(itemClassToItemViewTypeMap[clazz]) } override fun getItemCount(): Int { return data.size } }