Custom Grid Layout Setup

package com.blogspot.kidsmaths.ui.dashboard


import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.navigation.findNavController
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.blogspot.kidsmaths.GameType
import com.blogspot.kidsmaths.databinding.DashboardListItemBinding
import com.blogspot.kidsmaths.databinding.ListItemDashboardHeaderBinding
import com.blogspot.kidsmaths.models.GameHeader
import com.blogspot.kidsmaths.models.GameItem
import com.blogspot.kidsmaths.models.GameItemType

class DashboardListAdapter :
ListAdapter<GameItemType, RecyclerView.ViewHolder>(DashboardListDiff()) {
companion object {
private const val HEADER = 0
private const val ITEM = 1

}

class DashboardListDiff : DiffUtil.ItemCallback<GameItemType>() {
override fun areItemsTheSame(oldItem: GameItemType, newItem: GameItemType): Boolean {
return oldItem.id == newItem.id
}

override fun areContentsTheSame(oldItem: GameItemType, newItem: GameItemType): Boolean {
return oldItem == newItem
}

}

override fun getItemViewType(position: Int): Int {
return when (getItem(position)) {
is GameItemType.ITEM -> ITEM
is GameItemType.HEADER -> HEADER
}
}

class ItemViewHolder(private val binding: DashboardListItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: GameItem) {
binding.imgDataItem.setImageResource(item.image)
binding.tvDataName.text = item.type.name
binding.root.setOnClickListener {
val directions = if (item.type == GameType.EXAM) {
DashboardFragmentDirections.actionDashboardFragmentToCompetitiveExamsFragment2()
} else {
DashboardFragmentDirections.actionDashboardFragmentToGameFragment(item.type)
}
binding.root.findNavController().navigate(directions)
}
}

companion object {
fun from(parent: ViewGroup): ItemViewHolder {
val view = DashboardListItemBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return ItemViewHolder(view)
}
}
}

class HeaderViewHolder(private val binding: ListItemDashboardHeaderBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(data: GameHeader) {
binding.data = data
}

companion object {
fun from(parent: ViewGroup): HeaderViewHolder {
val view = ListItemDashboardHeaderBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return HeaderViewHolder(view)
}
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView
.ViewHolder {
return when (viewType) {
HEADER -> HeaderViewHolder.from(parent)
ITEM -> ItemViewHolder.from(parent)
else -> throw ClassCastException("Unable to cast to videotape : $viewType")
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ItemViewHolder -> holder.bind((getItem(position) as GameItemType.ITEM).data)
is HeaderViewHolder -> holder.bind((getItem(position) as GameItemType.HEADER).data)
}
}
}

class DashboardSpanSizeLookup(private val list: List<GameItemType>) :
GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return when (list[position]) {
is GameItemType.HEADER -> 2
is GameItemType.ITEM -> 1
else -> 1
}
}
}


Comments