Skip to main content

How to implement different view types in a RecyclerView in Kotlin Android

How to implement different view types in a RecyclerView in Kotlin Android.

Here's a step-by-step tutorial on how to implement different view types in a RecyclerView in Kotlin for Android:

Step 1: Create a new Android project in Android Studio, and add the necessary dependencies in your app-level build.gradle file:

implementation 'androidx.recyclerview:recyclerview:1.2.1'

Step 2: Create the layout files for your different view types. For example, let's create two layout files: item_type1.xml and item_type2.xml. These layouts will represent the different view types in your RecyclerView.

item_type1.xml:

<TextView
android:id="@+id/textViewType1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Type 1"
android:textSize="18sp" />

item_type2.xml:

<TextView
android:id="@+id/textViewType2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Type 2"
android:textSize="18sp" />

Step 3: Create the ViewHolder classes for each view type. In this example, we'll create two ViewHolder classes: Type1ViewHolder and Type2ViewHolder.

class Type1ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textViewType1: TextView = itemView.findViewById(R.id.textViewType1)
}

class Type2ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textViewType2: TextView = itemView.findViewById(R.id.textViewType2)
}

Step 4: Create the Adapter class for your RecyclerView. This adapter will handle the different view types.

class MyAdapter(private val itemList: List<Any>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

companion object {
private const val VIEW_TYPE_1 = 1
private const val VIEW_TYPE_2 = 2
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
VIEW_TYPE_1 -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_type1, parent, false)
Type1ViewHolder(view)
}
VIEW_TYPE_2 -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_type2, parent, false)
Type2ViewHolder(view)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder.itemViewType) {
VIEW_TYPE_1 -> {
val item = itemList[position] as Type1Item
val type1ViewHolder = holder as Type1ViewHolder
type1ViewHolder.textViewType1.text = item.text
}
VIEW_TYPE_2 -> {
val item = itemList[position] as Type2Item
val type2ViewHolder = holder as Type2ViewHolder
type2ViewHolder.textViewType2.text = item.text
}
}
}

override fun getItemCount(): Int {
return itemList.size
}

override fun getItemViewType(position: Int): Int {
return when (itemList[position]) {
is Type1Item -> VIEW_TYPE_1
is Type2Item -> VIEW_TYPE_2
else -> throw IllegalArgumentException("Invalid item type")
}
}
}

Step 5: Create the data classes for your different item types. In this example, we'll create two data classes: Type1Item and Type2Item.

data class Type1Item(val text: String)

data class Type2Item(val text: String)

Step 6: In your activity or fragment, initialize the RecyclerView and set the adapter.

val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
val itemList = listOf(
Type1Item("Type 1 Item 1"),
Type2Item("Type 2 Item 1"),
Type1Item("Type 1 Item 2"),
Type2Item("Type 2 Item 2")
)
val adapter = MyAdapter(itemList)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter

That's it! You have now implemented different view types in a RecyclerView in Kotlin for Android. The RecyclerView will display items of different view types based on the data provided in the adapter.