Bird
Raised Fist0
Android Kotlinmobile~20 mins

ViewModel creation in Android Kotlin - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
ViewModel Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
📝 Syntax
intermediate
2:00remaining
Correct ViewModel class declaration
Which option correctly declares a simple ViewModel class in Kotlin for Android?
Aclass MyViewModel : ViewModel() {}
Bclass MyViewModel extends ViewModel {}
Cclass MyViewModel : ViewModel {}
Dfun MyViewModel() : ViewModel {}
Attempts:
2 left
💡 Hint
Remember Kotlin uses ':' for inheritance and parentheses for constructor calls.
❓ ui_behavior
intermediate
2:00remaining
ViewModel lifecycle behavior
What happens to a ViewModel instance when the associated Activity is rotated (configuration change)?
AThe ViewModel is destroyed and recreated with the Activity.
BThe ViewModel instance is retained and reused by the new Activity instance.
CThe ViewModel is paused and resumed after rotation.
DThe ViewModel is converted to a singleton shared across all Activities.
Attempts:
2 left
💡 Hint
Think about how ViewModel helps keep UI data during screen rotations.
🧠 Conceptual
advanced
2:00remaining
Purpose of ViewModel in MVVM architecture
What is the main role of a ViewModel in the MVVM pattern on Android?
ATo handle UI rendering and user input directly.
BTo replace the Activity and Fragment lifecycle methods.
CTo store and manage UI-related data and handle business logic separate from UI.
DTo manage database connections and network calls only.
Attempts:
2 left
💡 Hint
ViewModel acts as a bridge between UI and data layers.
🔧 Debug
advanced
2:00remaining
Identify the error in ViewModel usage
What error will occur with this code snippet? val viewModel = ViewModelProvider(this).get(MyViewModel::class.java) class MyViewModel {}
Android Kotlin
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

class MyViewModel {}
ANo error, code runs correctly.
BCompile error: Missing parentheses in ViewModelProvider constructor.
CRuntime error: ViewModelProvider requires a Fragment, not Activity.
DCompile error: MyViewModel must extend ViewModel class.
Attempts:
2 left
💡 Hint
Check if MyViewModel inherits from the correct base class.
❓ navigation
expert
2:00remaining
ViewModel sharing between fragments
How can two fragments in the same Activity share the same ViewModel instance?
AUse ViewModelProvider with the Activity as the owner for both fragments.
BCreate separate ViewModel instances in each fragment using their own ViewModelProvider(this).
CPass ViewModel instance manually via fragment arguments bundle.
DUse a singleton ViewModel instance created outside the Activity.
Attempts:
2 left
💡 Hint
Think about the lifecycle owner scope when requesting ViewModel.

Practice

(1/5)
1. What is the main purpose of a ViewModel in Android development?
easy
A. To define the layout of the app screen
B. To handle user input events directly
C. To store and manage UI-related data in a lifecycle conscious way
D. To manage network requests

Solution

  1. Step 1: Understand ViewModel role

    A ViewModel is designed to hold UI data safely during configuration changes like screen rotations.
  2. Step 2: Compare options

    Only To store and manage UI-related data in a lifecycle conscious way describes this purpose correctly; others describe unrelated tasks.
  3. Final Answer:

    To store and manage UI-related data in a lifecycle conscious way -> Option C
  4. Quick Check:

    ViewModel purpose = store UI data safely [OK]
Hint: ViewModel holds UI data safely during screen changes [OK]
Common Mistakes:
  • Confusing ViewModel with UI layout classes
  • Thinking ViewModel handles user input directly
  • Assuming ViewModel manages network calls
2. Which of the following is the correct way to declare a ViewModel class in Kotlin?
easy
A. class MyViewModel extends ViewModel {}
B. class MyViewModel : ViewModel() {}
C. fun MyViewModel() : ViewModel {}
D. val MyViewModel = ViewModel()

Solution

  1. Step 1: Recall Kotlin class syntax

    Kotlin uses a colon (:) to extend a class and parentheses for constructor calls.
  2. Step 2: Check each option

    class MyViewModel : ViewModel() {} uses correct Kotlin syntax for extending ViewModel; others use Java syntax or invalid declarations.
  3. Final Answer:

    class MyViewModel : ViewModel() {} -> Option B
  4. Quick Check:

    Kotlin inheritance uses ':' and parentheses [OK]
Hint: Use ':' to extend class in Kotlin, not 'extends' [OK]
Common Mistakes:
  • Using Java syntax 'extends' in Kotlin
  • Declaring ViewModel as a function
  • Assigning ViewModel to a val without class
3. Given this ViewModel code snippet, what will be the output when counter.value is printed after increment() is called twice?
class CounterViewModel : ViewModel() {
  val counter = MutableLiveData(0)
  fun increment() {
    counter.value = (counter.value ?: 0) + 1
  }
}
medium
A. 2
B. 1
C. null
D. 0

Solution

  1. Step 1: Understand initial value and increment

    counter starts at 0; each increment adds 1 to current value.
  2. Step 2: Calculate after two increments

    After first call: 0 + 1 = 1; after second call: 1 + 1 = 2.
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    Two increments from 0 = 2 [OK]
Hint: Each increment adds 1; two calls add 2 total [OK]
Common Mistakes:
  • Forgetting to unwrap nullable value
  • Assuming counter resets each time
  • Confusing LiveData with normal variable
4. Identify the error in this ViewModel code:
class SampleViewModel : ViewModel() {
  val data = MutableLiveData<String>()

  fun updateData(newData: String) {
    data.value = newData
  }

  fun getData(): String {
    return data.value
  }
}
medium
A. ViewModel class must be abstract
B. MutableLiveData cannot hold String values
C. updateData() should not modify LiveData value
D. getData() returns nullable String but declared as non-nullable

Solution

  1. Step 1: Check LiveData type and usage

    MutableLiveData<String> can hold String values; updateData() correctly sets value.
  2. Step 2: Analyze getData() return type

    data.value is nullable String?, but getData() returns non-nullable String, causing a type mismatch.
  3. Final Answer:

    getData() returns nullable String but declared as non-nullable -> Option D
  4. Quick Check:

    LiveData value is nullable; return type must match [OK]
Hint: LiveData.value is nullable; match return types carefully [OK]
Common Mistakes:
  • Ignoring nullable type of LiveData.value
  • Thinking ViewModel must be abstract
  • Believing LiveData can't hold String
5. You want to create a ViewModel that holds a list of user names and updates the UI reactively. Which is the best way to declare and update this list inside your ViewModel?
hard
A. class UserViewModel : ViewModel() {\n val users = MutableLiveData(emptyList())\n fun addUser(name: String) {\n users.value = users.value?.plus(name)\n }\n}
B. class UserViewModel : ViewModel() {\n val users = mutableListOf<String>()\n fun addUser(name: String) {\n users.add(name)\n }\n}
C. class UserViewModel : ViewModel() {\n var users = listOf<String>()\n fun addUser(name: String) {\n users += name\n }\n}
D. class UserViewModel : ViewModel() {\n val users = LiveData()\n fun addUser(name: String) {\n users.value = listOf(name)\n }\n}

Solution

  1. Step 1: Identify reactive data holder

    MutableLiveData<List<String>> allows UI to observe changes and update reactively.
  2. Step 2: Check update method correctness

    class UserViewModel : ViewModel() {\n val users = MutableLiveData<List<String>>(emptyList())\n fun addUser(name: String) {\n users.value = users.value?.plus(name)\n }\n} uses users.value?.plus(name) to add a user immutably and update LiveData, which is correct.
  3. Step 3: Review other options

    class UserViewModel : ViewModel() {\n val users = mutableListOf<String>()\n fun addUser(name: String) {\n users.add(name)\n }\n} uses mutableList but not LiveData, so UI won't update reactively. class UserViewModel : ViewModel() {\n var users = listOf<String>()\n fun addUser(name: String) {\n users += name\n }\n} uses var list but no LiveData. class UserViewModel : ViewModel() {\n val users = LiveData<List<String>>()\n fun addUser(name: String) {\n users.value = listOf(name)\n }\n} tries to instantiate LiveData directly, which is abstract and invalid.
  4. Final Answer:

    class UserViewModel : ViewModel() {\n val users = MutableLiveData<List<String>>(emptyList())\n fun addUser(name: String) {\n users.value = users.value?.plus(name)\n }\n} -> Option A
  5. Quick Check:

    Use MutableLiveData with immutable updates for reactive UI [OK]
Hint: Use MutableLiveData and update list immutably for UI updates [OK]
Common Mistakes:
  • Using mutableList without LiveData for UI data
  • Trying to instantiate LiveData directly
  • Modifying list without updating LiveData value
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard