Skip to content

Instantly share code, notes, and snippets.

@NezSpencer
Created March 10, 2019 07:26
Show Gist options
  • Save NezSpencer/9edebfc4d2f50973c5bd11bba6a8194e to your computer and use it in GitHub Desktop.
Save NezSpencer/9edebfc4d2f50973c5bd11bba6a8194e to your computer and use it in GitHub Desktop.
Recyclerview adapter with the header-footer pattern applied
inner class ItemAdapter(private val list: MutableList<String>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val itemHeader = 20
private val itemBody = 21
private val itemFooter = 22
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): RecyclerView.ViewHolder {
return when(p1){
itemHeader -> HeaderHolder(ItemHeaderBinding.inflate(LayoutInflater.from(p0.context), p0, false))
itemBody -> BodyHolder(ItemNameBinding.inflate(LayoutInflater.from(p0.context), p0, false))
else -> FooterHolder(ItemFooterBinding.inflate(LayoutInflater.from(p0.context), p0, false))
}
}
override fun getItemCount(): Int = list.size
override fun onBindViewHolder(p0: RecyclerView.ViewHolder, p1: Int) {
if (p0.adapterPosition == 0 || p0.adapterPosition == list.size - 1)
return
val body : BodyHolder = p0 as BodyHolder
body.binding.tvName.text = list[p0.adapterPosition]
}
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
super.onViewRecycled(holder)
Log.d("onViewRecycled", "view ${holder.adapterPosition} recycled")
}
override fun getItemViewType(position: Int): Int {
return when (position) {
0 -> itemHeader
list.size - 1 -> itemFooter
else -> itemBody
}
}
}
inner class HeaderHolder(val binding : ItemHeaderBinding) : RecyclerView.ViewHolder(binding.root)
inner class BodyHolder(val binding : ItemNameBinding) : RecyclerView.ViewHolder(binding.root)
inner class FooterHolder(val binding : ItemFooterBinding) : RecyclerView.ViewHolder(binding.root)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment