1. 项目结构
在 Kotlin 中实现 MVVM 架构时,通常将项目分为三个主要部分:
- Model:负责数据管理和业务逻辑。
- View:负责显示数据和用户交互。
- ViewModel:作为 Model 和 View 之间的桥梁,处理逻辑并提供数据给 View。
2. 定义数据模型(Model)
定义数据类来封装你的数据结构。例如,如果你正在开发一个电影应用,可以定义一个 Movie
数据类:
data class Movie(val id: Int, val title: String, val posterPath: String)
3. 创建 ViewModel
ViewModel 负责管理 UI 相关的数据,并在数据发生变化时通知 View。使用 LiveData
来实现数据的观察:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.MutableLiveData
class MovieViewModel : ViewModel() {
private val _movieList = MutableLiveData<List<Movie>>()
val movieList: LiveData<List<Movie>> get() = _movieList
fun fetchMovies() {
// 模拟从网络或数据库获取数据
val movies = listOf(
Movie(1, "Movie 1", "path1"),
Movie(2, "Movie 2", "path2")
)
_movieList.value = movies
}
}
4. 实现 View(Activity 或 Fragment)
在 View 中,你可以使用 LiveData
来观察 ViewModel 中的数据变化,并更新 UI:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.minjee.basicmvvmexample.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val viewModel: MovieViewModel by viewModels()
private lateinit var movieAdapter: MovieAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setupRecyclerView()
setupObservers()
}
private fun setupRecyclerView() {
movieAdapter = MovieAdapter()
binding.rvMovies.apply {
layoutManager = LinearLayoutManager(this@MainActivity)
adapter = movieAdapter
}
}
private fun setupObservers() {
viewModel.movieList.observe(this) { movies ->
movieAdapter.submitList(movies)
}
}
}
5. 使用 Data Binding
Data Binding 是一种更高级的方式,可以将 ViewModel 中的数据直接绑定到布局文件中。首先,需要在 build.gradle
文件中启用 Data Binding:
android {
...
buildFeatures {
dataBinding true
}
}
然后,在布局文件中使用 data
标签来绑定 ViewModel:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="com.example.MovieViewModel" />
</data>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMovies"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
app:layoutManager="LinearLayoutManager"
app:adapter="@{viewModel.movieList}" />
</layout>
6. 集成 Repository
为了进一步解耦数据源和 ViewModel,可以使用 Repository 模式。Repository 负责从不同的数据源(如网络、数据库)获取数据,并提供给 ViewModel:
class MovieRepository {
suspend fun getMovies(): List<Movie> {
// 从网络或数据库获取数据
return listOf(
Movie(1, "Movie 1", "path1"),
Movie(2, "Movie 2", "path2")
)
}
}
然后在 ViewModel 中使用 Repository:
class MovieViewModel(private val repository: MovieRepository) : ViewModel() {
private val _movieList = MutableLiveData<List<Movie>>()
val movieList: LiveData<List<Movie>> get() = _movieList
fun fetchMovies() {
viewModelScope.launch {
val movies = repository.getMovies()
_movieList.value = movies
}
}
}
7. 测试和优化
- 单元测试:为 ViewModel 和 Repository 编写单元测试,确保逻辑正确。
- 性能优化:使用
DiffUtil
和ListAdapter
来优化 RecyclerView 的性能。 - 错误处理:在 ViewModel 中处理错误,并通过 LiveData 通知 View。
通过以上步骤,你可以使用 Kotlin 实现一个完整的 MVVM 架构应用。这种架构有助于提高代码的可维护性和可测试性,同时使 UI 和业务逻辑解耦。