LiveData (Which is similar to ObservableObject in SwiftUI)

This is my note for Udemy lesson: Advanced Android Bootcamp 2024.

1. Create ViewModel

Please check the previous note.

2. Edit ViewModel

class MainActivityViewModel: ViewModel() {
  private val _count = MutableLiveData(0)
  val count: LiveData<Int> get() = _count
  fun add() {
    _count.value = _count.value?.plus(1)
  }
}

3. Edit onCreate() Function in MainActivity

override fun onCreate(savedInstanceState: Bundle?) {
  ...
  viewModel.count.observe(this, Observer {
    binding.countText.text = it.toString()
  })
  viewModel.addButton.setOnclickListener {
    viewModel.add()
  }
}

ViewModel

This is my note for Udemy lesson: Advanced Android Bootcamp 2024.

1. Add Dependencies

In app/build.gradle, add the following dependencies:

dependencies {
  def lifecycle_version = "2.7.0"
  implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
  implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}

You can check the latest version through this website

2. Create a ViewModel

import androidx.lifecycle.ViewModel

class MainActivityViewModel: ViewModel() {
  ...
}

3. Use the ViewModel in Activity

class MainActivity: AppCompatActivity() {
  private lateinit var viewModel: MainViewModel

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    viewModel = ViewModelProvider(this)[MainActivityViewModel::class.java]
  }
}

Pass object from Activity to xml

This is my note for Udemy lesson: Advanced Android Bootcamp 2024.

1. Set up Data Binding

Please see my previous note.

2. Edit the xml File

<layout ...>
  <data>
    <variable name="student" type="com.xxx.xxx.Student" />
  </data>
  <androidx.constraintlayout.widget.ConstraintLayout ...>
    ...
    <TextView
      ...
      android:text-"@{student.name}" />
    ...
  </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

3. Pass the Object from Activity

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
  binding.student = Student("Alex")
}

Simple Data Binding

1. In app/build.gradle, add the following code:

android {
  ...
  dataBinding {
    enabled = true
  }
}

Also it can be

android {
  ...
  buildFeatures {
    dataBinding = true
  }
}

2. Add an extra layout in layout xml file.

Before:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:... android:...>
  ...
</androidx.constraintlayout.widget.ConstraintLayout>

After:

<layout xmlns:...>
  <androidx.constraintlayout.widget.ConstraintLayout android:...>
    ...
  </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

3. Use data binding in Activity.

Before:

private lateinit var button: Button

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  button = findViewById(R.id.control_button)
  button.setOnClickListener { ... }
}

After:

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
  binding.controlButton.setOnClickListener { ... }
}

カスとマイズerrorのlocalizedDescription

enum CustomizedError: LocalizedError {
    case unexpectedError
    case sessionNotExist

    var errorDescription: String? {
        switch self {
        case .unexpectedError:
            return "unexpected error"
        case .sessionNotExist:
            return "session not exist"
        }
    }
}

sortedWith

data class CustomDate(
    val year: Int,
    val month: Int,
    val day: Int
)

fun main() {
    var custumDates = listOf(
        CustomDate(2023, 1, 1),
        CustomDate(2023, 1, 2),
        CustomDate(2023, 2, 1),
        CustomDate(2022, 1, 1),
        CustomDate(2022, 1, 2),
        CustomDate(2022, 2, 1)
    )
        .shuffled()
        .sortedWith(
            compareBy<CustomDate> { it.year }
                .thenBy { it.month }
                .thenBy { it.day }
        )
    for (customDate in custumDates) {
        println(customDate.toString())
    }
}