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
}

You may also like

Leave a Reply