列表刷新时,只刷新对应的item,实现精准刷新;
1、重写实体类的equals方法,只比较id字段
class UserBean {
var age: String? = null
var id: Int = 0
var name: String? = null
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is UserBean) return false
// 重写equals方法,只比较id字段
if (id != other.id) return false
return true
}
override fun hashCode(): Int {
return id
}
}
关键方法:
private fun updateDataByid(i: Int) {
// 1、new一个【新bean】,只赋值id;(重写bean的equals 方法,通过id判断对象相等)
val info = UserBean().apply {
id = i
}
// 2、得到这【新bean】的下标
val index = list.indexOf(info)
Log.d("caowj", "index=${index}")
if (index >= 0) {
// 3、通过下标,获取到这个位置的真正的bean
val bean = list[index]
// 4、再修改真正的bean的信息
bean.age = "35"
bean.name = "王五"
// 5、刷新item(position 一般就等于 所在list的索引)
// 说明:特殊布局,可能存在不一致的情况,视具体情况而定
mAdapter.notifyItemChanged(index)
}
}
完整代码如下:
import android.Manifest
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
@Permission(
value = [
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.INTERNET]
)
class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
override fun getContentViewId() = R.layout.activity_main
lateinit var list: MutableList<UserBean>
lateinit var mAdapter: ExampleAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initData()
initRecyclerView()
nViewDataBinding.btnTest.setOnClickListener {
updateDataByid(24)
}
}
private fun initData() {
list = mutableListOf()
list.add(UserBean().apply {
id = 23
age = "23"
name = "张三"
})
list.add(UserBean().apply {
id = 24
age = "24"
name = "李四"
})
}
private fun initRecyclerView() {
mAdapter = ExampleAdapter(list)
nViewDataBinding.mRecyclerView.adapter = mAdapter
nViewDataBinding.mRecyclerView.layoutManager = LinearLayoutManager(this)
}
private fun updateDataByid(i: Int) {
// 1、new一个新对象,赋值id;(重写bean的equals 方法,通过id判断对象相等)
val info = UserBean().apply {
id = i
}
// 2、得到这对象的下标
val index = list.indexOf(info)
Log.d("caowj", "index=${index}")
if (index >= 0) {
// 3、通过下标,获取到这个位置的真正的bean
val bean = list[index]
// 4、再修改真正的bean的角标信息
bean.age = "35"
bean.name = "王五"
// 5、刷新item(position 一般就等于 所在list的索引)
mAdapter.notifyItemChanged(index)
}
}
class ExampleAdapter(private val exampleList: List<UserBean>) :
RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder>() {
class ExampleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView1: TextView = itemView.findViewById(android.R.id.text1)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder {
val itemView =
LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false)
return ExampleViewHolder(itemView)
}
override fun getItemCount(): Int {
return exampleList.size
}
override fun onBindViewHolder(holder: ExampleViewHolder, position: Int) {
val currentItem = exampleList[position]
holder.textView1.text = currentItem.name
}
}
}