Android - Save ArrayList to SharedPreferences with Kotlin
Last Updated :
15 Mar, 2023
SharedPreferences is local storage in android which is used to store data in the form of key and value pairs within the android devices. We can store data in the form of key and value pairs using Shared Preferences. In this article, we will take a look at How to Save Array List to SharedPreferences in Android using Kotlin. A sample video is given below to get an idea about what we are going to do in this article.
Note: If you are looking to implement How to Save Array List to Shared Preferences in Android using Java. Check out the following article: How to Save ArrayList to SharedPreferences in Android using Java
Step-by-Step Implementation:
Step 1: Create a New Project in Android Studio
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Kotlin as the programming language.
Step 2: Adding dependency for gson in build.gradle
Navigate to the app > Gradle Scripts > build.gradle(app) and add the below dependency in the dependencies section.
implementation 'com.google.code.gson:gson:2.8.5'
After adding this dependency simply sync your project to install it.
Step 3: Creating a modal class for storing our data
Navigate to the app > java > your app’s package name > Right-click on it > New > Kotlin class and name your class as CourseRVModal and add the below code to it. Comments are added in the code to get to know in detail.
Kotlin
package com.gtappdevelopers.kotlingfgproject
data class CourseRVModal(
// on below line we are creating a two
// variable one for course name
// and other for course image.
var courseName: String,
var courseImg: Int
)
Step 4: Creating a layout file for our item of RecyclerView
Navigate to the app > res > layout > Right-click on it > New > layout resource file and name your layout as course_rv_item and add the below code to it.
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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
app:cardCornerRadius="5dp"
app:cardElevation="4dp">
<!--on below line we are creating a
linear layout for grid view item-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!--on below line we are creating
a simple image view-->
<ImageView
android:id="@+id/idIVCourse"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:layout_margin="8dp"
android:padding="5dp"
android:src="@mipmap/ic_launcher" />
<!--on below line we are creating
a simple text view-->
<TextView
android:id="@+id/idTVCourse"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:padding="4dp"
android:text="@string/app_name"
android:textAlignment="textStart"
android:textColor="@color/black"
android:textStyle="bold"
tools:ignore="RtlCompat" />
</LinearLayout>
</androidx.cardview.widget.CardView>
Step 5: Creating an adapter class for setting data to items of our RecyclerView
Navigate to the app > java > your app’s package name > Right-click on it > New > Kotlin class and name it as CourseRVAdapter and add the below code to it.
Kotlin
package com.gtappdevelopers.kotlingfgproject
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
// on below line we are creating
// a course rv adapter class.
class CourseRVAdapter(
// on below line we are passing variables
// as course list and context
private var courseList: ArrayList<CourseRVModal>,
) : RecyclerView.Adapter<CourseRVAdapter.CourseViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): CourseRVAdapter.CourseViewHolder {
// this method is use to inflate the layout file
// which we have created for our recycler view.
// on below line we are inflating our layout file.
val itemView = LayoutInflater.from(parent.context).inflate(
R.layout.course_rv_item,
parent, false
)
// at last we are returning our view holder
// class with our item View File.
return CourseViewHolder(itemView)
}
override fun onBindViewHolder(holder: CourseRVAdapter.CourseViewHolder, position: Int) {
// on below line we are setting data to our text view and our image view.
holder.courseNameTV.text = courseList.get(position).courseName
holder.courseIV.setImageResource(courseList.get(position).courseImg)
}
override fun getItemCount(): Int {
// on below line we are returning
// our size of our list
return courseList.size
}
class CourseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
// on below line we are initializing our course name text view and our image view.
val courseNameTV: TextView = itemView.findViewById(R.id.idTVCourse)
val courseIV: ImageView = itemView.findViewById(R.id.idIVCourse)
}
}
Step 6: Working with the activity_main.xml file
Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file.
XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<!--on below line we are creating a card view-->
<androidx.cardview.widget.CardView
android:id="@+id/idCVAddLanguage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
app:cardCornerRadius="4dp"
app:cardElevation="3dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--on below line we are creating edit text
for adding a language name-->
<EditText
android:id="@+id/idEdtLanguage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter Language" />
<!--on below line we are creating a linear layout for
adding different images within it-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/idEdtLanguage"
android:orientation="horizontal"
android:weightSum="5">
<ImageView
android:id="@+id/idIVAndroid"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_margin="4dp"
android:layout_weight="1"
android:padding="3dp"
android:src="@drawable/android" />
<ImageView
android:id="@+id/idIVC"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_margin="4dp"
android:layout_weight="1"
android:padding="3dp"
android:src="@drawable/c" />
<ImageView
android:id="@+id/idIVJava"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_margin="4dp"
android:layout_weight="1"
android:padding="3dp"
android:src="@drawable/java" />
<ImageView
android:id="@+id/idIVJs"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_margin="4dp"
android:layout_weight="1"
android:padding="3dp"
android:src="@drawable/js" />
<ImageView
android:id="@+id/idIVPython"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_margin="4dp"
android:layout_weight="1"
android:padding="3dp"
android:src="@drawable/python" />
</LinearLayout>
</RelativeLayout>
</androidx.cardview.widget.CardView>
<!--on below line we are creating our recycler view-->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/idRVLanguages"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/idBtnSaveList"
android:layout_below="@id/idCVAddLanguage"
android:layout_margin="4dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<!--on below line we are creating a button to
save our list to shared preferences-->
<Button
android:id="@+id/idBtnSaveList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="10dp"
android:text="Save List"
android:textAllCaps="false" />
</RelativeLayout>
Step 7: Working with the MainActivity.kt file
Navigate to app > java > your app's package name > MainActivity.kt file and add the below code to it. Comments are added in the code to get to know in detail.
Kotlin
package com.gtappdevelopers.kotlingfgproject
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import java.lang.reflect.Type
class MainActivity : AppCompatActivity() {
// on below line we are creating
// a variable for our button
lateinit var androidIV: ImageView
lateinit var cIV: ImageView
lateinit var javaIV: ImageView
lateinit var jsIV: ImageView
lateinit var pythonIV: ImageView
lateinit var languageRV: RecyclerView
lateinit var saveBtn: Button
lateinit var lngEdt: EditText
lateinit var courseList: ArrayList<CourseRVModal>
lateinit var courseRVAdapter: CourseRVAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// on below line we are initializing
// our views with their ids.
androidIV = findViewById(R.id.idIVAndroid)
cIV = findViewById(R.id.idIVC)
javaIV = findViewById(R.id.idIVJava)
jsIV = findViewById(R.id.idIVJs)
pythonIV = findViewById(R.id.idIVPython)
languageRV = findViewById(R.id.idRVLanguages)
saveBtn = findViewById(R.id.idBtnSaveList)
lngEdt = findViewById(R.id.idEdtLanguage)
// method to load arraylist from shared prefs
// initializing our shared prefs with name as
// shared preferences.
val sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE)
// creating a variable for gson.
val gson = Gson()
// below line is to get to string present from our
// shared prefs if not present setting it as null.
val json = sharedPreferences.getString("courses", null)
// below line is to get the type of our array list.
val type: Type = object : TypeToken<ArrayList<CourseRVModal?>?>() {}.type
// in below line we are getting data from gson
// and saving it to our array list
courseList = gson.fromJson<Any>(json, type) as ArrayList<CourseRVModal>
// checking below if the array list is empty or not
if (courseList == null) {
// if the array list is empty
// creating a new array list.
courseList = ArrayList()
}
// on below line we are initializing our adapter
// and setting it to recycler view.
courseRVAdapter = CourseRVAdapter(courseList)
languageRV.adapter = courseRVAdapter
androidIV.setOnClickListener {
if (lngEdt.text.toString().isNotEmpty()) {
// on below line adding item to recycler view.
addItemToList(lngEdt.text.toString(), R.drawable.android)
}
}
cIV.setOnClickListener {
if (lngEdt.text.toString().isNotEmpty()) {
// on below line adding item to recycler view.
addItemToList(lngEdt.text.toString(), R.drawable.c)
}
}
javaIV.setOnClickListener {
if (lngEdt.text.toString().isNotEmpty()) {
// on below line adding item to recycler view.
addItemToList(lngEdt.text.toString(), R.drawable.java)
}
}
jsIV.setOnClickListener {
if (lngEdt.text.toString().isNotEmpty()) {
// on below line adding item to recycler view.
addItemToList(lngEdt.text.toString(), R.drawable.js)
}
}
pythonIV.setOnClickListener {
if (lngEdt.text.toString().isNotEmpty()) {
// on below line adding item to recycler view.
addItemToList(lngEdt.text.toString(), R.drawable.python)
}
}
// on below line we are adding
// click listener for our save button
saveBtn.setOnClickListener {
// method for saving the data in array list.
// creating a variable for storing data in
// shared preferences.
val sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE)
// creating a variable for editor to
// store data in shared preferences.
val editor = sharedPreferences.edit()
// creating a new variable for gson.
val gson = Gson()
// getting data from gson and storing it in a string.
val json: String = gson.toJson(courseList)
// below line is to save data in shared
// prefs in the form of string.
editor.putString("courses", json)
// below line is to apply changes
// and save data in shared prefs.
editor.apply()
// after saving data we are displaying a toast message.
Toast.makeText(this, "Saved Array List to Shared preferences. ", Toast.LENGTH_SHORT)
.show()
}
}
private fun addItemToList(lngName: String, lngImg: Int) {
// in this method we are adding item to list and
// notifying adapter that data has changed
courseList.add(CourseRVModal(lngName, lngImg))
courseRVAdapter.notifyDataSetChanged()
}
}
Now run your application to see the output of it.
Output:
To save an ArrayList to SharedPreferences in Kotlin on Android, you can follow these steps:
Convert the ArrayList to a Set of strings using the toSet() function.
- Get an instance of the SharedPreferences using the getSharedPreferences() method.
- Get an instance of the SharedPreferences.Editor using the edit() method.
- Put the Set of strings into the SharedPreferences.Editor using the putStringSet() method.
- Call the apply() method on the SharedPreferences.Editor instance to save the changes.
Here's some sample code that demonstrates how to save an ArrayList of strings to SharedPreferences in Kotlin:
Kotlin
import android.content.Context
import android.content.SharedPreferences
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Create an ArrayList of strings
val myArrayList = arrayListOf("item1", "item2", "item3")
// Save the ArrayList to SharedPreferences
saveArrayListToSharedPreferences("myArrayList", myArrayList)
// Retrieve the saved ArrayList from SharedPreferences
val retrievedArrayList = getArrayListFromSharedPreferences("myArrayList")
// Print the retrieved ArrayList to the console
Log.d("TAG", "Retrieved ArrayList: $retrievedArrayList")
}
private fun saveArrayListToSharedPreferences(key: String, arrayList: ArrayList<String>) {
// Convert the ArrayList to a Set of strings
val mySet = arrayList.toSet()
// Get an instance of the SharedPreferences
val sharedPreferences = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
// Get an instance of the SharedPreferences.Editor
val editor = sharedPreferences.edit()
// Put the Set of strings into the SharedPreferences.Editor
editor.putStringSet(key, mySet)
// Apply the changes to the SharedPreferences
editor.apply()
}
private fun getArrayListFromSharedPreferences(key: String): ArrayList<String> {
// Get an instance of the SharedPreferences
val sharedPreferences = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
// Retrieve the Set of strings from SharedPreferences
val mySet = sharedPreferences.getStringSet(key, emptySet())
// Convert the Set of strings back to an ArrayList
val myArrayList = arrayListOf<String>()
myArrayList.addAll(mySet!!)
return myArrayList
}
}
Output:
Retrieved ArrayList: [item1, item2, item3]
Similar Reads
How to Save ArrayList to SharedPreferences in Android?
SharedPreferences in Android is local storage that is used to store strings, integers, and variables in phone storage so that we can manage the state of the app. We have seen storing simple variables in shared prefs with key and value pair. In this article, we will see How we can store ArrayList to
7 min read
Android - Implement Preference Setting Screen with Kotlin
In many apps, we have seen the Settings screen which is most common in most of the apps. This settings screen is used to manage the preferences of the users. For creating this settings screen android provides a feature to make a settings preferences screen. In this article, we will take a look at im
5 min read
Shared Preferences in Android with Example
One of the most Interesting Data Storage options Android provides its users is Shared Preferences. Shared Preferences is the way in which one can store and retrieve small amounts of primitive data as key/value pairs to a file on the device storage such as String, int, float, Boolean that make up you
7 min read
SearchView in Android with Kotlin
SearchView is a widget in android which provides a search interface with the help of which users can be able to make searches within the given list of data. In this search view, the user has to specify the search query. According to the search, query results will be populated within the listview. In
4 min read
Preferences DataStore in Android
Preference Data Store is used to store data permanently in android. Earlier we had to Shared Preferences for the same but since it is deprecated we are using Data Store now. A sample video is given at the end to get an idea about what we are going to do in this article. Note that we are going to imp
4 min read
How to Delete Shared Preferences Data in Android?
In Android, Shared Preferences is a method of storing and fetching primitive data with the help of a key. This is file is stored inside the application in the form of an XML file. It is used to save data of types int, long, string, boolean, etc. In this article, we will show you how you could save a
3 min read
Encrypted Shared Preferences in Android
Many times we want to save the data within the android application. This data is in the form of text and we generally prefer to store this data in the shared preferences. Shared preferences are not secure as we can simply view the data stored within the shared preferences and can easily access data
5 min read
Android Session Management with Kotlin
Session Management is seen in most of the android applications in which we can get to know the login and sign-up page. This is used to store the session of the user when he is logged into the application. When the user login inside the application for the first time. The user credentials such as ema
7 min read
Expandable RecyclerView in Android with Kotlin
In this article, we will get to know how to implement the expandable RecyclerView. In General, we will show the list of items in the listview but in some situations like if you want to show the sub-list items, then we have to use an expandable list. See the below image for a better understanding. ex
7 min read
Retrofit with Kotlin Coroutine in Android
Retrofit is a type-safe http client which is used to retrieve, update and delete the data from web services. Nowadays retrofit library is popular among the developers to use the API key. The Kotlin team defines coroutines as âlightweight threadsâ. They are sort of tasks that the actual threads can e
3 min read