Skip to main content

How to display different item layouts in a RecyclerView in Kotlin Android

How to display different item layouts in a RecyclerView in Kotlin Android.

Here's a step-by-step tutorial on how to display different item layouts in a RecyclerView in Kotlin for Android.

Step 1: Set up your project​

Create a new Android project in Android Studio and add the necessary dependencies for RecyclerView in your app's build.gradle file:

dependencies {
// Other dependencies...
implementation 'androidx.recyclerview:recyclerview:1.2.1'
}

Step 2: Create the layout files​

Create the layout files for the different item layouts you want to display in your RecyclerView. For example, let's say you want to display two different layouts: item_layout1.xml and item_layout2.xml. Design these layouts according to your requirements.

Step 3: Create the ViewHolder classes​

Create ViewHolder classes for each item layout. These ViewHolder classes will hold references to the views in the corresponding layout files.

class ItemViewHolder1(itemView: View) : RecyclerView.ViewHolder(itemView) {
// Define references to views in item_layout1.xml
val textView1: TextView = itemView.findViewById(R.id.text_view1)
val imageView1: ImageView = itemView.findViewById(R.id.image_view1)
}

class ItemViewHolder2(itemView: View) : RecyclerView.ViewHolder(itemView) {
// Define references to views in item_layout2.xml
val textView2: TextView = itemView.findViewById(R.id.text_view2)
val button1: Button = itemView.findViewById(R.id.button1)
}

Step 4: Create the Adapter class​

Create an Adapter class that extends RecyclerView.Adapter and define the necessary methods.

class CustomAdapter(private val itemList: List<Item>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
ITEM_TYPE_1 -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout1, parent, false)
ItemViewHolder1(view)
}
ITEM_TYPE_2 -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout2, parent, false)
ItemViewHolder2(view)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = itemList[position]
when (holder.itemViewType) {
ITEM_TYPE_1 -> {
val viewHolder1 = holder as ItemViewHolder1
// Bind data to views in item_layout1.xml
viewHolder1.textView1.text = item.text
viewHolder1.imageView1.setImageResource(item.imageResId)
}
ITEM_TYPE_2 -> {
val viewHolder2 = holder as ItemViewHolder2
// Bind data to views in item_layout2.xml
viewHolder2.textView2.text = item.text
viewHolder2.button1.setOnClickListener {
// Perform action for button click
}
}
}
}

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

override fun getItemViewType(position: Int): Int {
// Return the view type for each item in the list
return itemList[position].type
}

companion object {
private const val ITEM_TYPE_1 = 1
private const val ITEM_TYPE_2 = 2
}
}

Step 5: Set up the RecyclerView in your activity or fragment​

In your activity or fragment, set up the RecyclerView and attach the adapter to it.

class MainActivity : AppCompatActivity() {

private lateinit var recyclerView: RecyclerView
private lateinit var adapter: CustomAdapter

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

// Initialize RecyclerView
recyclerView = findViewById(R.id.recycler_view)
recyclerView.layoutManager = LinearLayoutManager(this)

// Create a list of items with different types
val itemList = listOf(
Item("Item 1", R.drawable.image1, CustomAdapter.ITEM_TYPE_1),
Item("Item 2", R.drawable.image2, CustomAdapter.ITEM_TYPE_1),
Item("Item 3", R.drawable.image3, CustomAdapter.ITEM_TYPE_2),
Item("Item 4", R.drawable.image4, CustomAdapter.ITEM_TYPE_2)
)

// Create and set the adapter
adapter = CustomAdapter(itemList)
recyclerView.adapter = adapter
}
}

That's it! You have successfully implemented a RecyclerView with different item layouts in Kotlin for Android. Customize the layout files, ViewHolder classes, and adapter as per your specific requirements.