Skip to content

Instantly share code, notes, and snippets.

@ishaquehassan
Last active January 17, 2019 14:28
Show Gist options
  • Save ishaquehassan/12a5c97c4968ca99c6f304d871ee5cfa to your computer and use it in GitHub Desktop.
Save ishaquehassan/12a5c97c4968ca99c6f304d871ee5cfa to your computer and use it in GitHub Desktop.
A RecyclerView Adapter for general purpose simple lists. It supports all common features including itemViewType.
package com.ishaquehassan.recyclerviewgeneraladapter
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class RecyclerGeneralTypeAdapter<T>(val data:ArrayList<T>, private val layoutFiles:Map<Int,Int>, val onGetViewType:(Int, T)->Int, val onBindItem:(itemData:T, viewHolder:RecyclerGeneralTypeAdapter<T>.RecyclerGeneralViewHolder)->Unit) : RecyclerView.Adapter<RecyclerGeneralTypeAdapter<T>.RecyclerGeneralViewHolder>(){
constructor(data:ArrayList<T>,layoutFile: Int,onBindItem:(T,RecyclerGeneralTypeAdapter<T>.RecyclerGeneralViewHolder)->Unit):this(data, mapOf(-10 to layoutFile),{_,_->-10},onBindItem)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
RecyclerGeneralViewHolder(
LayoutInflater.from(parent.context).inflate(
layoutFiles[viewType]!!,
parent,
false
)
)
override fun getItemCount(): Int = data.size
override fun onBindViewHolder(holder: RecyclerGeneralViewHolder, position: Int) = holder.onBindItem(data[position])
override fun getItemViewType(position: Int): Int = onGetViewType(position,data[position])
inner class RecyclerGeneralViewHolder(v:View) : RecyclerView.ViewHolder(v){
fun onBindItem(item:T){
onBindItem(item,this)
}
}
}
//Usage
data class ItemModel(val title:String)
//Simple Usage without ViewType
yourRecyclerViewInstance.adapter = RecyclerGeneralTypeAdapter(
arrayListOf(ItemModel("Item 1"),ItemModel("Item 2")),
R.layout.your_item_layout
){ itemData,viewHolder ->
val itemView = viewHolder.itemView
val position = viewHolder.adapterPosition
itemView.findViewById<TextView>(R.id.item_title_tv).text = itemData.title
}
//Adavanced Usage with ViewType
yourRecyclerViewInstance.adapter = RecyclerGeneralTypeAdapter(
arrayListOf(ItemModel("Item 1"),ItemModel("Item 2")),
mapOf(
// Key = ViewTypw , Value = Layout Resource File
1 to R.layout.your_item_layout_1,
2 to R.layout.your_item_layout_2
),{position,itemData ->
//ViewType Decision on basis of item data
if(itemData.title == "Item 1"){1}
//ViewType Decision on basis of item position
else if(position == 1){2}
//Default ViewType should be returned too
else {1}
}
){ itemData,viewHolder ->
val itemView = viewHolder.itemView
val position = viewHolder.adapterPosition
itemView.findViewById<TextView>(R.id.item_title_tv).text = itemData.title
}
@Usamaliaquat123
Copy link

✌️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment