interface
RoutineItem {
val viewType: Int
}
data
class
RoutineModel(
val workout: String,
val unit: String,
val details: ArrayList<RoutineDetailModel> = arrayListOf(),
override val viewType: Int = VIEW_TYPE
) : RoutineItem {
companion object {
const
val VIEW_TYPE = R.layout.item_routine
}
}
data
class
RoutineDetailModel(
val id: String,
val set: String,
val rep: String,
override val viewType: Int = VIEW_TYPE
) : RoutineItem {
companion object {
const
val VIEW_TYPE = R.layout.item_routine_detail
}
}
class
RoutineListAdapter(
val addDetailClicked: (Int) -> Unit,
val deleteDetailClicked: (Int) -> Unit
) : ListAdapter<RoutineItem, RecyclerView.ViewHolder>(DIFF_CALLBACK) {
override fun getItemViewType(position: Int): Int = getItem(position).viewType
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent,
false
)
return
when (viewType) {
RoutineModel.VIEW_TYPE -> RoutineViewHolder(
itemView,
addDetailClicked,
deleteDetailClicked
)
RoutineDetailModel.VIEW_TYPE -> RoutineDetailViewHolder(itemView)
else
->
throw
IllegalArgumentException(
"Invalid view type: $viewType"
)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = getItem(position)
when (holder) {
is RoutineViewHolder -> holder.bind(item as RoutineModel)
is RoutineDetailViewHolder -> holder.bind(item as RoutineDetailModel)
}
}
companion object {
private
val DIFF_CALLBACK = object : DiffUtil.ItemCallback<RoutineItem>() {
override fun areItemsTheSame(
oldItem: RoutineItem,
newItem: RoutineItem
): Boolean {
return
oldItem.javaClass == newItem.javaClass && oldItem == newItem
}
override fun areContentsTheSame(
oldItem: RoutineItem,
newItem: RoutineItem
): Boolean {
return
oldItem == newItem
}
}
}
}
class
WriteRoutineViewModel(
private
val repository: RoutineRepository = RoutineRepository()
) : ViewModel() {
private
val _items: MutableLiveData<List<RoutineItem>> = MutableLiveData(listOf())
val items: LiveData<List<RoutineItem>> = _items
fun addRoutine(workout: String) {
repository.addRoutine(RoutineModel(workout,
"TEST"
))
emitListItems()
}
fun addDetail(pos: Int) {
val detail = RoutineDetailModel(routineUseCase.setId.toString(),
"TEST"
,
"33"
)
repository.addDetail(pos, detail)
emitListItems()
}
fun deleteDetail(pos: Int) {
repository.deleteDetail(pos)
emitListItems()
}
private
fun emitListItems() {
_items.postValue(repository.getListItems())
}
}
class
RoutineRepository() {
private
val routines = arrayListOf<RoutineModel>()
var setId =
1
private
set
fun addRoutine(routine: RoutineModel) {
routines.add(routine)
}
fun addDetail(pos: Int, detail: RoutineDetailModel) {
routines[pos].details.add(detail)
setId++
}
fun deleteDetail(pos: Int) {
if
(routines[pos].details.isEmpty()) {
routines.removeAt(pos)
return
}
routines[pos].details.removeAt(routines[pos].details.lastIndex)
}
fun getListItems(): List<RoutineItem> {
val result = arrayListOf<RoutineItem>()
for
(routine in routines) {
result.add(routine)
result.addAll(routine.details)
}
return
result
}
}