class
RoutineAdapter(val addDetailClicked: (Int) -> Unit,
val deleteDetailClicked: (Int) -> Unit)
: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private
var items: ArrayList<RoutineModel> = arrayListOf()
private
val viewPool = RecyclerView.RecycledViewPool()
companion object {
private
const
val TYPE_ROUTINE =
1
private
const
val TYPE_ROUTINE_FOOTER =
2
}
fun setItems(items: ArrayList<RoutineModel>) {
this
.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
lateinit var itemView: View
return
when (viewType) {
TYPE_ROUTINE -> {
val binding = ItemRoutineBinding.inflate(LayoutInflater.from(parent.context), parent,
false
)
RoutineViewHolder(binding)
}
else
-> {
itemView = LayoutInflater.from(parent.context).inflate(R.layout.add_routine_button, parent,
false
)
RoutineFooterViewHolder(itemView)
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when(getItemViewType(position)) {
TYPE_ROUTINE -> {
val item = items[position]
holder as RoutineViewHolder
holder.bind(items[position])
initDetailLayoutManager(holder, item, position)
}
else
-> holder as RoutineFooterViewHolder
}
}
override fun getItemViewType(position: Int): Int {
return
when(position) {
items.size -> TYPE_ROUTINE_FOOTER
else
-> TYPE_ROUTINE
}
}
override fun getItemCount(): Int = items.size +
1
private
fun initDetailLayoutManager(holder : RoutineViewHolder, item: RoutineModel, pos: Int) {
val lm = LinearLayoutManager(
holder.subRV.context,
LinearLayoutManager.VERTICAL,
false
)
lm.initialPrefetchItemCount = item.getSubItemList().size
val detailAdapter = RoutineDetailAdapter(items[pos].getSubItemList())
holder.subRV.layoutManager = lm
holder.subRV.adapter = detailAdapter
holder.subRV.setRecycledViewPool(viewPool)
}
inner
class
RoutineViewHolder(
private
val binding: ItemRoutineBinding) : RecyclerView.ViewHolder(binding.root) {
val subRV = binding.rv
init {
binding.add.setOnClickListener {
addDetailClicked(adapterPosition)
}
binding.delete.setOnClickListener {
deleteDetailClicked(adapterPosition)
}
}
fun bind(list: RoutineModel) {
binding.workout.text = list.workout
}
}
inner
class
RoutineFooterViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
private
val button: ConstraintLayout = itemView.findViewById(R.id.add_routine)
init {
button.setOnClickListener { view ->
view.findNavController().navigate(R.id.action_writeRoutineFragment_to_workoutListTabFragment)
}
}
}
}