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"/>