codingstuff.io
ExploreTutorialsProblemsCS Subjects
Get Started
ExploreTutorialsProblemsCS Subjects
Get Started
codingstuff.io

Master the art of building software through interactive tutorials, real-world problems, and guided projects.

Pune, Maharashtra, India

codingstuffmail@gmail.com

Product

  • Explore
  • Tutorials
  • Problems
  • CS Subjects

Company

  • About
  • Contact
  • Privacy Policy
  • Terms & Conditions
  • Sitemap

© 2026 codingstuff.io. All rights reserved.

Built with ❤️ for developers everywhere

/
/
All Tutorials
🎯

Kotlin

47 / 68 topics
44Kotlin for Android Development45Android Kotlin Basics46Kotlin Android Extensions47ViewModel and LiveData48Room Persistence Library
Tutorials/Kotlin/ViewModel and LiveData
🎯Kotlin

ViewModel and LiveData

Updated 2026-04-20
3 min read

ViewModel and LiveData

Introduction

In Android development, managing UI-related data can be challenging, especially when dealing with configuration changes like screen rotations or device orientation changes. The ViewModel and LiveData components from the Architecture Components library help to solve these problems by providing a robust framework for handling UI-related data in a lifecycle-conscious way.

This tutorial will guide you through understanding how to use ViewModel and LiveData effectively in your Kotlin applications, including real-world code examples and best practices.

What is ViewModel?

The ViewModel class is designed to store and manage UI-related data in a lifecycle-conscious way. Unlike activities or fragments, which are tied to the activity lifecycle, ViewModel instances survive configuration changes such as screen rotations. This makes it an ideal place to hold and manage data that needs to be retained across different configurations.

What is LiveData?

LiveData is a lifecycle-aware observable data holder class. It holds a value and notifies observers about any changes to that value. Unlike other observable classes, LiveData respects the lifecycle of other app components, such as activities, fragments, or services. This means that it only updates active observers, which prevents memory leaks and ensures that your UI is always in sync with the data.

Setting Up Your Project

Before you start using ViewModel and LiveData, make sure to add the necessary dependencies to your project. Open your build.gradle file (Module: app) and add the following:

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
    implementation "androidx.activity:activity-ktx:1.4.0"
    implementation "androidx.fragment:fragment-ktx:1.4.1"
}

Sync your project with Gradle files to download the dependencies.

Creating a ViewModel

To create a ViewModel, extend the ViewModel class and add any data or methods you need:

import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Example data
    val userName: MutableLiveData<String> = MutableLiveData()

    init {
        userName.value = "John Doe"
    }

    fun updateUserName(newName: String) {
        userName.value = newName
    }
}

In this example, MyViewModel contains a MutableLiveData object called userName, which holds the user's name. The updateUserName method allows you to update the value of userName.

Using LiveData in an Activity

To use LiveData in an activity, you need to get an instance of your ViewModel and observe the LiveData objects:

import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

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

        // Observe the userName LiveData
        viewModel.userName.observe(this, Observer { newName ->
            textView.text = "Hello, $newName!"
        })

        button.setOnClickListener {
            val newName = editText.text.toString()
            viewModel.updateUserName(newName)
        }
    }
}

In this example, MainActivity uses the viewModels() delegate to get an instance of MyViewModel. It then observes the userName LiveData object and updates a TextView whenever the value changes. The button click listener updates the userName in the ViewModel.

Best Practices

  1. Separate UI Logic from Business Logic: Use ViewModel to hold and manage data related to the UI, but keep business logic separate.
  2. Use LiveData for Observables: Always use LiveData or its variants (MutableLiveData, Transformations) for observable data that needs to be lifecycle-aware.
  3. Avoid Direct Access to LiveData: Encourage direct access to LiveData objects only in the activity or fragment where they are observed.
  4. Handle Configuration Changes Gracefully: By using ViewModel, you automatically handle configuration changes without losing data.

Advanced Usage

Transformations

Transformations provide a way to transform one LiveData object into another. This is useful when you need to derive new data from existing LiveData.

import androidx.lifecycle.Transformations
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    val userName: MutableLiveData<String> = MutableLiveData()

    init {
        userName.value = "John Doe"
    }

    fun updateUserName(newName: String) {
        userName.value = newName
    }

    val greeting: LiveData<String> = Transformations.map(userName) { name ->
        "Hello, $name!"
    }
}

In this example, the greeting LiveData is derived from the userName LiveData using a transformation.

MediatorLiveData

MediatorLiveData allows you to observe other LiveData objects and react to changes in them. This is useful when you need to combine data from multiple sources.

import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    val userName: MutableLiveData<String> = MutableLiveData()
    val userAge: MutableLiveData<Int> = MutableLiveData()

    init {
        userName.value = "John Doe"
        userAge.value = 30
    }

    fun updateUserName(newName: String) {
        userName.value = newName
    }

    fun updateUserAge(newAge: Int) {
        userAge.value = newAge
    }

    val userInfo: MediatorLiveData<String> = MediatorLiveData()

    init {
        userInfo.addSource(userName) { name ->
            userInfo.value = "Name: $name, Age: ${userAge.value}"
        }
        userInfo.addSource(userAge) { age ->
            userInfo.value = "Name: ${userName.value}, Age: $age"
        }
    }
}

In this example, userInfo is a MediatorLiveData that combines data from userName and userAge.

Conclusion

ViewModel and LiveData are powerful tools for managing UI-related data in Android applications. By using these components, you can create more robust and maintainable apps that handle configuration changes gracefully. This tutorial has covered the basics of ViewModel and LiveData, along with some advanced usage patterns. As you continue to develop your Kotlin applications, remember to follow best practices to ensure a clean and efficient codebase.

Happy coding!


PreviousKotlin Android ExtensionsNext Room Persistence Library

Recommended Gear

Kotlin Android ExtensionsRoom Persistence Library