【发布时间】:2019-10-04 08:28:58
【问题描述】:
您好,我正在尝试在我的应用程序中使用 listadapter 和 diffcallback。不知何故,当我做某事时,视图根本不会更新。
当我在回调中的“areItemsTheSame”和“areContentsTheSame”中放入一些日志时,根本不会调用它。
这是我的主要活动
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)
}
}
我的视图模型
class TodoViewModel: ViewModel() {
val todos = MutableLiveData<ArrayList<Todo>>()
init{
todos.value = arrayListOf(
Todo(1, "cooking"),
Todo(2, "washing")
)
}
}
不幸的是,android 文档没有提供更多关于此的示例。
同样,我的 DiffUtil 类中的两个“日志”都没有被调用。当我单击删除按钮时,UI 未更新,但日志显示正确的结果。
谢谢
【问题讨论】:
-
我可以看看你的视图模型吗?
-
您确定您的列表确实在改变吗?
-
我昨天和你有同样的问题。那是因为您使用的列表是视图模型中相同的索引引用,您可以尝试调试并检查适配器和实时数据视图模型中的列表我的解决方案但不是最好的方法是从实时数据复制数组并发布具有不同引用的新数组跨度>
-
@RofieSagara 我在上面添加了它,谢谢
-
在初始设置后,您并没有真正改变 todos 的值。为什么会触发 diffutils?
标签: android kotlin android-recyclerview