gpt4 book ai didi

android - 列表适配器中未调用 DiffCallback

转载 作者:行者123 更新时间:2023-12-02 13:35:31 27 4
gpt4 key购买 nike

您好,我正在尝试在我的应用程序中使用 listadapter 和 diffcallback。不知何故,当我做某事时, View 根本没有更新。

当我在回调中的“areItemsTheSame”和“areContentsTheSame”中放入一些日志时,它根本没有被调用。

这是我的主要 Activity

class MainActivity : AppCompatActivity() {

private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: TodoAdapter
private lateinit var viewManager: RecyclerView.LayoutManager

private lateinit var viewModel : TodoViewModel

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

//viewModel
viewModel = ViewModelProviders.of(this).get(TodoViewModel::class.java)
viewManager = LinearLayoutManager(this)
viewAdapter = TodoAdapter(viewModel.todos)

binding.btnNew.setOnClickListener {
viewModel.todos.value!!.add(Todo(3, binding.newText.text.toString()))
}

recyclerView = binding.myRecyclerView

recyclerView.apply {
layoutManager = viewManager
adapter = viewAdapter
}

viewModel.todos.observe(this, Observer{ list ->
viewAdapter.submitList(list)
Log.i("debug", "im @observe " + list.toString())
})

}

这是我的适配器

 class TodoAdapter(var items: MutableLiveData<ArrayList<Todo>>):
ListAdapter<Todo, TodoAdapter.MyViewHolder>(TodoDiffCallback()) {

// Create new views (invoked by the layout manager)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
// create a new view
val inflater = LayoutInflater.from(parent.context)
val binding = ListItemBinding.inflate(inflater)

return MyViewHolder(binding)
}


override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.todoText.text = getItem(position).task

//delete
holder.delBtn.setOnClickListener {
items.value!!.removeAt(position)
submitList(items.value)
Log.i("debug", "@adapter what is items " + items.value.toString())
}

//override fun getItemCount() = items.value!!.size


class MyViewHolder(val binding: ListItemBinding) : RecyclerView.ViewHolder(binding.root) {
val todoText = binding.todoItem
val delBtn = binding.btnDelete
val ediBtn = binding.btnEdit
}

class TodoDiffCallback : DiffUtil.ItemCallback<Todo>(){

override fun areItemsTheSame(p0: Todo, p1: Todo): Boolean {
Log.i("debug", " here " +p0 + " inItems " + p1 )
return p0 == p1
}

override fun areContentsTheSame(p0: Todo, p1: Todo): Boolean {
Log.i("debug", "here " + p0 + " inContents" + p1 )
return p0.equals(p1)
}

我的 View 模型

class TodoViewModel: ViewModel() {

val todos = MutableLiveData<ArrayList<Todo>>()

init{
todos.value = arrayListOf(
Todo(1, "cooking"),
Todo(2, "washing")
)
}

不幸的是,android 文档没有给出更多的例子。

同样,我的 DiffUtil 类中的两个“日志”根本没有被调用。当我单击删除按钮时,UI 未更新但日志显示正确的结果。

谢谢

最佳答案

当前工作方案

我读到“在 liveData 中观察”,它在我调用“setValue”方法之前不会触发。

所以我在我的 ViewModel 类中添加了一些新方法,我在其中应用了 setValue添加 newItem 的例子

fun addTodo(text: String) {
_todos.value!!.add(Todo(3, text))
_todos.setValue(_todos.value)
}

到目前为止它有效。在 MainActivity 中,我现在只运行一次 submitList

   viewModel.todos.observe(this, Observer{ list ->
viewAdapter.submitList(list.toMutableList())
})

我仍然有一个问题,项目的“位置”仍然不正确。示例:

  1. 当我删除所有项目时,应用程序崩溃
  2. 在我从第二个位置 (array[1]) 删除项目然后删除新添加的任务后,它会给出“错误索引超出范围”

所以 onBindViewHolder 中的“位置”在删除/或做其他事情后没有改变[更新](问题通过使用解决:holder.getAdapterPosition())

关于android - 列表适配器中未调用 DiffCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58232606/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com