Skip to content

Instantly share code, notes, and snippets.

@sys1yagi
Created May 1, 2016 14:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sys1yagi/10d4f3220adecb0e7466893760351679 to your computer and use it in GitHub Desktop.
Save sys1yagi/10d4f3220adecb0e7466893760351679 to your computer and use it in GitHub Desktop.
package jp.dip.sys1.aozora.views.adapters
import android.support.v7.widget.RecyclerView
import android.view.ViewGroup
import java.util.*
abstract class HeaderAdapter<ViewHolder : RecyclerView.ViewHolder, Item, Header, Footer>() : RecyclerView.Adapter<ViewHolder>() {
companion object {
const val TYPE_HEADER = 0
const val TYPE_ITEM = 1
const val TYPE_FOOTER = 2
}
override fun getItemViewType(position: Int): Int {
return when (position) {
0 -> {
header?.let {
TYPE_HEADER
} ?: TYPE_ITEM
}
itemCount - 1 -> {
footer?.let {
TYPE_FOOTER
} ?: TYPE_ITEM
}
else -> TYPE_ITEM
}
}
var header: Header? = null
var footer: Footer? = null
var items: ArrayList<Item> = ArrayList<Item>()
fun addAll(items: List<Item>) {
this.items.addAll(items)
}
val isEmpty: Boolean
get() = items.isEmpty()
override fun getItemCount(): Int {
return items.size + headerCount() + footerCount()
}
fun headerCount() = header?.let { 1 } ?: 0
fun footerCount() = (footer?.let { 1 } ?: 0)
abstract fun onCreateHeaderViewHolder(parent: ViewGroup, viewType: Int): ViewHolder
abstract fun onCreateItemViewHolder(parent: ViewGroup, viewType: Int): ViewHolder;
abstract fun onCreateFooterViewHolder(parent: ViewGroup, viewType: Int): ViewHolder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return when (viewType) {
TYPE_HEADER -> onCreateHeaderViewHolder(parent, viewType)
TYPE_FOOTER -> onCreateFooterViewHolder(parent, viewType)
else -> onCreateItemViewHolder(parent, viewType)
}
}
abstract fun onBindItemViewHolder(holder: ViewHolder, position: Int)
abstract fun onBindHeaderViewHolder(holder: ViewHolder, position: Int)
abstract fun onBindFooterViewHolder(holder: ViewHolder, position: Int)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
return when (getItemViewType(position)) {
TYPE_HEADER -> onBindHeaderViewHolder(holder, position)
TYPE_FOOTER -> onBindFooterViewHolder(holder, position)
else -> onBindItemViewHolder(holder, position - headerCount())
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment