android: 用viewmodel更新数据

一,代码:

activity xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activity.VmListActivity">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <Button
        android:id="@+id/button"
        android:layout_gravity="center"
        android:layout_marginTop="30dp"
        android:text="点击添加数据"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycle"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#ffff00" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

activity 代码:

class VmListActivity : AppCompatActivity() {

    private lateinit var binding: ActivityVmListBinding   //binding
    private lateinit var viewModel: UserViewModel     //保存数据的viewmodel
    private lateinit var ulAdapter: UserListAdapter    //adapter

    private lateinit var list: ArrayList<UserListItem>   //数据
    private var id = 3     // id,生成数据时使用
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        //使用binding
        binding = ActivityVmListBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 创建ViewModel实例
        viewModel = ViewModelProvider(this).get(UserViewModel::class.java)

        //添加一些初始化数据
        val u1 = UserListItem("11","张三1",1)
        val u2 = UserListItem("22","张三2",2)
        val u3 = UserListItem("33","张三3",3)

        list = ArrayList<UserListItem>()  // 创建可变列表
        list.add(u1)  // 添加元素
        list.add(u2)
        list.add(u3)
        
        viewModel.updateData(list)

        // 创建Adapter实例
        ulAdapter = UserListAdapter()

        // 关联Adapter和ViewModel
        viewModel.listData.observe(this, Observer {
            println("viewmodel的数据有变化...")
            ulAdapter.updateData(it)
        })

        //绑定view和adapter
        binding.recycle.layoutManager = LinearLayoutManager(this)
        binding.recycle.adapter = ulAdapter

        //处理按钮点击事件,创建一个假数据,保存到viewmodel
        binding.button.setOnClickListener {
            id++;
            val u = UserListItem("33","张三"+id,id)
            //println(u)
            list.add(u)
            viewModel.updateData(list)
        }
    }
}

数据类:

data class UserListItem(
    @SerializedName("image")
    val image: String,
    @SerializedName("name")
    val name: String,
    @SerializedName("id")
    val id: Int,
) : Serializable

viewmodel

package com.example.okdemo1.viewmodel

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.okdemo1.model.UserListItem

class UserViewModel: ViewModel() {
    private val _listData = MutableLiveData<MutableList<UserListItem>>()
    val listData: LiveData<MutableList<UserListItem>> = _listData

    fun updateData(newData: MutableList<UserListItem>) {
        _listData.value = newData
    }
}

adapter

package com.example.okdemo1.adapter

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.example.okdemo1.R
import com.example.okdemo1.adapter.UserListAdapter.UserListViewHolder
import com.example.okdemo1.model.UserListItem

class UserListAdapter : RecyclerView.Adapter<UserListViewHolder>(){

    private var userListData: MutableList<UserListItem> = mutableListOf()

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): UserListViewHolder {
        //TODO("Not yet implemented")
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_oneuser_layout, parent, false)
        return UserListViewHolder(view)
    }

    override fun onBindViewHolder(holder: UserListViewHolder, position: Int) {
        //TODO("Not yet implemented")
        val item = userListData[position]
        holder.bind(item)
    }

    override fun getItemCount(): Int {
        //TODO("Not yet implemented")
        return userListData.size
    }

    //更新数据
    fun updateData(list: MutableList<UserListItem>) {
        val diffResult = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
            override fun getOldListSize(): Int {
                return userListData.size
            }

            override fun getNewListSize(): Int {
                return list.size
            }

            override fun areItemsTheSame(
                oldItemPosition: Int,
                newItemPosition: Int
            ): Boolean {
                var oldItem = userListData[oldItemPosition]
                var newItem = list[newItemPosition]
                return oldItem.id == newItem.id
            }

            override fun areContentsTheSame(
                oldItemPosition: Int,
                newItemPosition: Int
            ): Boolean {
                var oldItem = userListData[oldItemPosition]
                var newItem = list[newItemPosition]
                return oldItem.id == newItem.id &&
                        oldItem.name == newItem.name
            }

        })
        userListData.clear()
        userListData.addAll(list)
        diffResult.dispatchUpdatesTo(this)
    }

    // ViewHolder定义,用于绑定UI组件
    class UserListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val textView: TextView = itemView.findViewById(R.id.textItem)

        fun bind(item: UserListItem) {
            textView.text = item.name
        }
    }

}

adapter(使用databinding,和上面那个用哪个都行)

package com.example.okdemo1.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.example.okdemo1.R
import com.example.okdemo1.adapter.UserListAdapter.UserListViewHolder
import com.example.okdemo1.databinding.ItemOneuserLayoutBinding
import com.example.okdemo1.model.UserListItem

class UserListAdapter : RecyclerView.Adapter<UserListViewHolder>(){

    private var userListData: MutableList<UserListItem> = mutableListOf()

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): UserListViewHolder {
        //TODO("Not yet implemented")
        var binding = ItemOneuserLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return UserListViewHolder(binding)
    }

    override fun onBindViewHolder(holder: UserListViewHolder, position: Int) {
        //TODO("Not yet implemented")
        val item = userListData[position]
        holder.bind(item)
    }

    override fun getItemCount(): Int {
        //TODO("Not yet implemented")
        return userListData.size
    }

    //更新数据
    fun updateData(list: MutableList<UserListItem>) {
        val diffResult = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
            override fun getOldListSize(): Int {
                return userListData.size
            }

            override fun getNewListSize(): Int {
                return list.size
            }

            override fun areItemsTheSame(
                oldItemPosition: Int,
                newItemPosition: Int
            ): Boolean {
                var oldItem = userListData[oldItemPosition]
                var newItem = list[newItemPosition]
                return oldItem.id == newItem.id
            }

            override fun areContentsTheSame(
                oldItemPosition: Int,
                newItemPosition: Int
            ): Boolean {
                var oldItem = userListData[oldItemPosition]
                var newItem = list[newItemPosition]
                return oldItem.id == newItem.id &&
                        oldItem.name == newItem.name
            }

        })
        userListData.clear()
        userListData.addAll(list)
        diffResult.dispatchUpdatesTo(this)
    }

    // ViewHolder定义,用于绑定UI组件
    class UserListViewHolder(val view: ItemOneuserLayoutBinding) : RecyclerView.ViewHolder(view.root) {
        fun bind(item: UserListItem) {
            view.textItem.text = item.name
        }
    }
}

列表中的单项 xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textItem"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:gravity="center_vertical"
    android:background="#dddddd"
    android:padding="16dp"
    android:textSize="30sp"/>

二,测试效果

posted @ 2025-06-28 13:03  刘宏缔的架构森林  阅读(54)  评论(0)    收藏  举报