您的位置:首页 > 财经 > 金融 > 黑马程序员教程_珠海网站制作定制_网站优化推广价格_游戏推广公司好做吗

黑马程序员教程_珠海网站制作定制_网站优化推广价格_游戏推广公司好做吗

2024/12/23 10:36:54 来源:https://blog.csdn.net/weixin_43275466/article/details/142917369  浏览:    关键词:黑马程序员教程_珠海网站制作定制_网站优化推广价格_游戏推广公司好做吗
黑马程序员教程_珠海网站制作定制_网站优化推广价格_游戏推广公司好做吗

Android架构组件MVVM模式的实战应用与数据绑定技巧

在现代Android开发中,MVVM(Model-View-

ViewModel)架构模式因其高效的数据分离和解耦优势,成为了开发者的首选。本文将详细介绍MVVM模式的基本概念、实战应用以及数据绑定技巧,并通过一个实际案例展示如何在Android项目中应用这些技术。

一、MVVM模式概述

MVVM模式是一种设计模式,它将应用分为三部分:Model、View和ViewModel。

  1. Model :负责应用的数据和业务逻辑,与数据源交互,提供数据给ViewModel。Model层通常是独立于界面的,可以在多个界面之间共享。

  2. View :UI界面,负责用户交互和显示信息。在Android中,View可以是Activity、Fragment、View等。

  3. ViewModel :连接Model和View,处理UI逻辑,将Model中的数据转换成UI需要的格式,并通知View进行更新。ViewModel通常是与View一一对应的,每个View都有一个对应的ViewModel。

通过这种分离,MVVM模式使得应用的各个部分各司其职,提高了代码的可读性、可维护性和可扩展性。

二、MVVM模式的实战应用

在Android项目中应用MVVM模式,需要借助Android架构组件,如LiveData、ViewModel和数据绑定(Data

Binding)。下面是一个简单的用户信息管理应用的实现步骤。

1. 添加依赖项

首先,在项目的 build.gradle 文件中添加必要的依赖项:

groovy复制代码dependencies {    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0"    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.0"    implementation "androidx.databinding:databinding-runtime:7.2.0"    }  
2. 定义数据模型

创建一个简单的数据类 UserModel 来表示用户信息:

kotlin复制代码data class UserModel(val name: String, val age: Int)  
3. 创建数据仓库

创建一个 UserRepository 类,用于模拟数据的获取和存储:

kotlin复制代码class UserRepository {    private val users = mutableListOf<UserModel>()    fun getUsers(): List<UserModel> = users    fun addUser(user: UserModel) {    users.add(user)    }    }  
4. 创建ViewModel

创建一个 UserViewModel 来管理用户数据,并持有LiveData以便UI可以观察数据变化:

kotlin复制代码import androidx.lifecycle.LiveData    import androidx.lifecycle.MutableLiveData    import androidx.lifecycle.ViewModel    class UserViewModel(private val userRepository: UserRepository) : ViewModel() {    private val _users = MutableLiveData<List<UserModel>>()    val users: LiveData<List<UserModel>> = _users    init {    _users.value = userRepository.getUsers()    }    fun addUser(name: String, age: Int) {    userRepository.addUser(UserModel(name, age))    _users.value = userRepository.getUsers() // Notify observers    }    }  
5. 创建UI层

MainActivity 中使用Data Binding来与ViewModel进行绑定,实现用户的列表展示和新增用户的输入功能:

kotlin复制代码import android.os.Bundle    import androidx.activity.viewModels    import androidx.appcompat.app.AppCompatActivity    import androidx.recyclerview.widget.LinearLayoutManager    import androidx.recyclerview.widget.RecyclerView    import androidx.databinding.DataBindingUtil    import com.example.mvvmexample.databinding.ActivityMainBinding    class MainActivity : AppCompatActivity() {    private lateinit var binding: ActivityMainBinding    private val userViewModel: UserViewModel by viewModels { UserViewModelFactory(UserRepository()) }    private lateinit var userAdapter: UserAdapter    override fun onCreate(savedInstanceState: Bundle?) {    super.onCreate(savedInstanceState)    // Setup Data Binding    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)    binding.lifecycleOwner = this    binding.viewModel = userViewModel    setupRecyclerView()    userViewModel.users.observe(this) { users ->    userAdapter.submitList(users)    }    }    private fun setupRecyclerView() {    // Initialize RecyclerView and Adapter    val recyclerView = binding.recyclerView    recyclerView.layoutManager = LinearLayoutManager(this)    userAdapter = UserAdapter()    recyclerView.adapter = userAdapter    }    }  

activity_main.xml 布局文件中使用Data Binding:

xml复制代码<layout xmlns:android="http://schemas.android.com/apk/res/android">    <data>    <variable    name="viewModel"    type="com.example.mvvmexample.viewmodel.UserViewModel" />    </data>    <LinearLayout    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <Button    android:id="@+id/buttonAdd"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Add User"    android:onClick="@{() -> viewModel.addUserClicked()}" />    <RecyclerView    android:id="@+id/recyclerView"    android:layout_width="match_parent"    android:layout_height="match_parent" />    </LinearLayout>    </layout>  

UserAdapter 中绑定用户数据:

kotlin复制代码class UserAdapter : RecyclerView.Adapter<UserAdapter.UserViewHolder>() {    private var users = emptyList<UserModel>()    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {    val itemView = LayoutInflater.from(parent.context)    .inflate(R.layout.item_user, parent, false)    return UserViewHolder(itemView)    }    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {    val user = users[position]    holder.bind(user)    }    override fun getItemCount(): Int = users.size    fun submitList(newUsers: List<UserModel>) {    this.users = newUsers    notifyDataSetChanged()    }    class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {    private val nameTextView: TextView = itemView.findViewById(R.id.textViewName)    private val ageTextView: TextView = itemView.findViewById(R.id.textViewAge)    fun bind(user: UserModel) {    nameTextView.text = user.name    ageTextView.text = user.age.toString()    }    }    }  

item_user.xml 布局文件中定义用户项:

xml复制代码<layout xmlns:android="http://schemas.android.com/apk/res/android">    <data>    <variable    name="user"    type="com.example.mvvmexample.data.UserModel" />    </data>    <LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal"    android:padding="16dp">    <TextView    android:id="@+id/textViewName"    android:layout_width="0dp"    android:layout_height="wrap_content"    android:layout_weight="1"    android:text="@{user.name}" />    <TextView    android:id="@+id/textViewAge"    android:layout_width="0dp"    android:layout_height="wrap_content"    android:layout_weight="1"    android:text="@{String.valueOf(user.age)}" />    </LinearLayout>    </layout>  
三、数据绑定技巧
  1. 单向数据绑定
    使用 @{...} 语法将UI组件与ViewModel中的数据进行绑定。例如,在 activity_main.xml 中:

    xml复制代码

    <TextView

    android:id="@+id/textViewName"    
    android:layout_width="wrap_content"    
    android:layout_height="wrap_content"    
    android:text="@{viewModel.userName}" />  
    
  2. 双向数据绑定
    使用 @={...} 语法实现双向绑定,通常用于输入框。例如,在 activity_main.xml 中添加一个输入框:

    xml复制代码

    <EditText

    android:id="@+id/editTextName"    
    android:layout_width="match_parent"    
    android:layout_height="wrap_content"    
    android:text="@={viewModel.userName}" />  
    
  3. 自定义绑定适配器
    对于复杂的数据绑定,可以创建自定义绑定适配器。例如,绑定图片:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com