Now I will show you how to use Generic RecycleView for different View Types.
First of creating Generic Recycleview Adapter (GenericAdapter) class as below.
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
abstract class GenericAdapter : RecyclerView.Adapter {
var listItems: List
constructor(listItems: List) {
this.listItems = listItems
}
constructor() {
listItems = emptyList()
}
fun setItems(listItems: List) {
this.listItems = listItems
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return getViewHolder(LayoutInflater.from(parent.context).inflate(viewType, parent, false)
,viewType)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
(holder as Binder).bind(listItems[position])
}
override fun getItemCount(): Int {
return listItems.size
}
override fun getItemViewType(position: Int): Int {
return getLayoutId(position, listItems[position])
}
protected abstract fun getLayoutId(position: Int, obj: T): Int
abstract fun getViewHolder(view: View, viewType: Int):RecyclerView.ViewHolder
internal interface Binder {
fun bind(data: T)
}
}
Now, How to use in Activity class
class MainActivity : AppCompatActivity() {
lateinit var recyclerView: RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView=findViewById(R.id.recyclerView)
val myAdapter = object : GenericAdapter(list) {
override fun getLayoutId(position: Int, obj: Any): Int {
return when(obj){
is Item1->R.layout.Item1_layout
is Item2->R.layout.Item2_layout
else->R.layout.Item1_layout
}
}
override fun getViewHolder(view: View, viewType: Int): RecyclerView.ViewHolder {
return JavaViewHolderFactory.create(view,viewType)
}
}
recyclerView.layoutManager= LinearLayoutManager(this)
recyclerView.setHasFixedSize(true)
recyclerView.adapter=myAdapter
}