
In Android Studio, there are different types of views to design our android applications. Views such as ImageView, TextView, ListView, etc. These types of views help you to make the user interface friendly. You can drag or drop the view in the XML design section or you can simply write the code in the XML code section.
ListView is one of the views from the view group which shows the data in a vertical scrollable format. It enhances the user experience as it makes the list easily understandable for users.
In this article, we are going to create a simple list using an array adapter.
We will store string data in an array and display the respective data in a list format.
Before that, we need to understand a few concepts used for creating a list such as adapters.
The adapter is present between the view and data. It helps to display data in views. All the data items are loaded in the adapter and with the help of view/UI, the data items are displayed.
There are different types of adapters that are used as per their requirements.
In this article, we will focus on ArrayAdapter only.
In the below example, we have used ArrayAdapter to display list items in our list.
In MainActivity.java, you can see I have created an array list called data in which all the list items are present in it.
Now, the same array list will be used in our ArrayAdapter to display the data using our list. Firstly, we will create an ArrayAdapter then we will set the adapter and it will be ready to show our data in our list.
Step 1: Create New Project in Android Studio.
Choose Empty Activity and then type the Application Name as “Custom ListView”.
Step 2: Pre-requisites
Gradle app
buildFeatures {
viewBinding true
}
Right-click and Save Image.







colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="lavender">#8692f7</color>
</resources>
strings.xml
<resources>
<string name="app_name">Recipe Book</string>
//pasta
<string name="pastaIngredients">Pasta
\nCream Cheese
\nParmesan Cheese
\nOlive Oil
\nGarlic
\nSalt Pepper</string>
<string name="pastaDesc">Cook your pasta until al dente
\nSaute’ garlic in olive oil until fragrant
\nAdd cream cheese, pasta cooking water, parmesan, and stir well
\nDrain and add pasta to the skillet
\nToss until well combined, adding some pasta water if needed</string>
//maggi
<string name="maggiIngredients">Maggi Noodles
\nWater
\nMaggi Masala</string>
<string name="maggieDesc">Add one and half cup of water
\nAdd maggi noodles and boil it
\nAdd the maggi masala on to it
\nWait for 2 mins
\nMaggi is ready!</string>
//cake
<string name="cakeIngredients">Maggi Noodles
\nWater
\nMaggi Masala</string>
<string name="cakeDesc">Add one and half cup of water
Add maggi noodles and boil it
Add the maggi masala on to it
\nWait for 2 mins
\nMaggi is ready!</string>
//pancake
<string name="pancakeIngredients">Maggi Noodles
\nWater
\nMaggi Masala</string>
<string name="pancakeDesc">Add one and half cup of water
Add maggi noodles and boil it
Add the maggi masala on to it
\nWait for 2 mins
\nMaggi is ready!</string>
//pizza
<string name="pizzaIngredients">Maggi Noodles
\nWater
\nMaggi Masala</string>
<string name="pizzaDesc">Add one and half cup of water
Add maggi noodles and boil it
Add the maggi masala on to it
\nWait for 2 mins
\nMaggi is ready!</string>
//burgers
<string name="burgerIngredients">Maggi Noodles
\nWater
\nMaggi Masala</string>
<string name="burgerDesc">Add one and half cup of water
\nAdd maggi noodles and boil it
\nAdd the maggi masala on to it
\nWait for 2 mins
\nMaggi is ready!</string>
//fries
<string name="friesIngredients">Maggi Noodles
\nWater
\nMaggi Masala</string>
<string name="friesDesc">Add one and half cup of water
\nAdd maggi noodles and boil it
\nAdd the maggi masala on to it
\nWait for 2 mins
\nMaggi is ready!</string>
</resources>
themes.xml
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:layout_marginVertical="10dp"
android:layout_marginHorizontal="10dp"
app:cardCornerRadius="20dp"
app:cardElevation="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.imageview.ShapeableImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/listImage"
android:src="@drawable/maggi"
android:scaleType="centerCrop"
android:layout_marginStart="10dp"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
app:shapeAppearanceOverlay="@style/roundedImageViewRounded"/>
<TextView
android:layout_width="120dp"
android:layout_height="30dp"
android:id="@+id/listName"
android:text="Name"
android:textColor="@color/lavender"
android:textSize="20sp"
android:layout_marginTop="25dp"
android:layout_marginStart="30dp"
android:layout_toEndOf="@id/listImage"/>
<TextView
android:layout_width="80dp"
android:layout_height="30dp"
android:id="@+id/listTime"
android:text="time"
android:textSize="16sp"
android:layout_toEndOf="@id/listName"
android:layout_marginTop="25dp"
android:layout_marginStart="100dp"
android:textColor="@color/lavender"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview"
android:scrollbars="vertical"
android:layout_marginTop="12dp"
tools:listitem="@layout/list_item"
android:divider="@android:color/transparent"
android:dividerHeight="10.0sp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
activity_detailed.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".DetailedActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/detailName"
android:layout_marginTop="14dp"
android:text="Recipe Name"
android:textSize="24sp"
android:textColor="@color/lavender"
android:textStyle="bold"
android:layout_gravity="center"/>
<androidx.cardview.widget.CardView
android:layout_width="380dp"
android:layout_height="200dp"
android:id="@+id/cardImage"
android:layout_marginTop="10dp"
android:layout_gravity="center"
app:cardCornerRadius="20dp"
app:cardElevation="8dp">
<ImageView
android:layout_width="380dp"
android:layout_height="200dp"
android:id="@+id/detailImage"
android:layout_marginTop="10dp"
android:layout_gravity="center"
android:src="@drawable/maggi"
android:scaleType="centerCrop"/>
</androidx.cardview.widget.CardView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Duration:"
android:textColor="@color/lavender"
android:textStyle="bold"
android:layout_marginStart="10dp"
android:layout_marginTop="30dp"
android:textSize="18sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="time"
android:layout_marginStart="10dp"
android:textSize="16sp"
android:id="@+id/detailTime"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ingredients:"
android:textColor="@color/lavender"
android:textStyle="bold"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:textSize="18sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/maggiIngredients"
android:layout_marginStart="10dp"
android:textSize="16sp"
android:id="@+id/detailIngredients"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Steps:"
android:textColor="@color/lavender"
android:textStyle="bold"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:textSize="18sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/maggieDesc"
android:layout_marginStart="10dp"
android:textSize="16sp"
android:id="@+id/detailDesc"/>
</LinearLayout>
ListData.kt
package com.example.listviewkotpractice
class ListData(
var name: String,
var time: String,
var ingredients: Int,
var desc: Int,
var image: Int
)
ListAdapter.kt
package com.example.listviewkotpractice
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
class ListAdapter(context: Context, dataArrayList: ArrayList<ListData?>?) :
ArrayAdapter<ListData?>(context, R.layout.list_item, dataArrayList!!) {
override fun getView(position: Int, view: View?, parent: ViewGroup): View {
var view = view
val listData = getItem(position)
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false)
}
val listImage = view!!.findViewById<ImageView>(R.id.listImage)
val listName = view.findViewById<TextView>(R.id.listName)
val listTime = view.findViewById<TextView>(R.id.listTime)
listImage.setImageResource(listData!!.image)
listName.text = listData.name
listTime.text = listData.time
return view
}
}
MainActivity.kt
package com.example.listviewkotpractice
import android.content.Intent
import android.os.Bundle
import android.widget.AdapterView.OnItemClickListener
import androidx.appcompat.app.AppCompatActivity
import com.example.listviewkotpractice.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var listAdapter: ListAdapter
private lateinit var listData: ListData
var dataArrayList = ArrayList<ListData?>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val imageList = intArrayOf(
R.drawable.pasta,
R.drawable.maggi,
R.drawable.cake,
R.drawable.pancake,
R.drawable.pizza,
R.drawable.burger,
R.drawable.fries
)
val ingredientList = intArrayOf(
R.string.pastaIngredients,
R.string.maggiIngredients,
R.string.cakeIngredients,
R.string.pancakeIngredients,
R.string.pizzaIngredients,
R.string.burgerIngredients,
R.string.friesIngredients
)
val descList = intArrayOf(
R.string.pastaDesc,
R.string.maggieDesc,
R.string.cakeDesc,
R.string.pancakeDesc,
R.string.pizzaDesc,
R.string.burgerDesc,
R.string.friesDesc
)
val nameList = arrayOf("Pasta", "Maggi", "Cake", "Pancake", "Pizza", "Burgers", "Fries")
val timeList = arrayOf("30 mins", "2 mins", "45 mins", "10 mins", "60 mins", "45 mins", "30 mins")
for (i in imageList.indices) {
listData = ListData(
nameList[i],
timeList[i], ingredientList[i], descList[i], imageList[i]
)
dataArrayList.add(listData)
}
listAdapter = ListAdapter(this@MainActivity, dataArrayList)
binding.listview.adapter = listAdapter
binding.listview.isClickable = true
binding.listview.onItemClickListener = OnItemClickListener { adapterView, view, i, l ->
val intent = Intent(this@MainActivity, DetailedActivity::class.java)
intent.putExtra("name", nameList[i])
intent.putExtra("time", timeList[i])
intent.putExtra("ingredients", ingredientList[i])
intent.putExtra("desc", descList[i])
intent.putExtra("image", imageList[i])
startActivity(intent)
}
}
}
DetailedActivity.kt
package com.example.listviewkotpractice
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.listviewkotpractice.databinding.ActivityDetailedBinding
class DetailedActivity : AppCompatActivity() {
private lateinit var binding: ActivityDetailedBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDetailedBinding.inflate(layoutInflater)
setContentView(binding.root)
val intent = this.intent
if (intent != null) {
val name = intent.getStringExtra("name")
val time = intent.getStringExtra("time")
val ingredients = intent.getIntExtra("ingredients", R.string.maggiIngredients)
val desc = intent.getIntExtra("desc", R.string.maggieDesc)
val image = intent.getIntExtra("image", R.drawable.maggi)
binding.detailName.text = name
binding.detailTime.text = time
binding.detailDesc.setText(desc)
binding.detailIngredients.setText(ingredients)
binding.detailImage.setImageResource(image)
}
}
}

If you find this article easy and insightful, please share it with your friends.
If you have any queries or errors related to the above context, please feel free to reach out through the comment section.
For a detailed explanation, please check my YouTube Video: Custom ListView in Android Studio using Kotlin
Check my other articles on Android Knowledge: https://androidknowledge.com/android/
Thank you 🙌