因此,我正在创建一个todo应用程序,用户可以设置优先级,优先级的星星通过绑定适配器以编程方式添加,但当滚动任务回收器视图时,星星数量为零的任务也显示星星,而检查日志显示零星星。此外,这个错误只发生在我滚动到有星星的项目,然后开始严格滚动时
我试着在每次更新项目时创建新的ArrayList。
片段代码:RecyclerView
viewModel.taskCategory.observe(viewLifecycleOwner, Observer { taskCategoryPair ->
taskCategoryPair?.let {
Log.i("HomeFragment","Submitting New List")
viewModel.filterDataFinish()
adaptor.submitList(it)
}
})
RecyclerView绑定代码。
RecyclerView.ViewHolder(binding.root) {
fun bind(
task: ToDo,
category: Category,
clickListener: MiscellaneousUtils.GetIdFromClick
) {
binding.task = task
binding.category = category
binding.clickListener = clickListener
binding.onCheckChangeListener = categorizedTasksClickListeners
binding.root.setOnLongClickListener {
categorizedTasksClickListeners.onLongClickItem(adapterPosition,it)
true
}
binding.executePendingBindings()
}
BindingAdapter函数添加星星。
@BindingAdapter("app:setPriority")
fun LinearLayoutCompat.setPriority(task: ToDo) {
if (task.priorityStars == 0)
return
val previousStarContainer = findViewWithTag<LinearLayout>("starContainerLayout")
if (previousStarContainer != null) {
removeView(previousStarContainer)
}
val starContainer = LinearLayout(context)
starContainer.tag = "starContainerLayout"
starContainer.layoutParams = LinearLayoutCompat.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
for (count in 1..task.priorityStars) {
val starView = ImageView(context)
starView.setImageResource(R.drawable.task_star)
starView.layoutParams = LinearLayoutCompat.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
starContainer.addView(starView)
}
addView(starContainer)
}
回收器回收视图:) - 它使用同一个视图来显示多个数据! 这意味着一个视图可以用来显示一个带有星星的对象--如此而已。onBindViewHolder
你会显示星星。然后同样的视图(现在有星星)将被用来显示不同的对象(没有星星的对象)--这意味着在 onBindViewHolder
你现在需要隐藏星星,我打赌你没有;)
正如我所说,如果你没有星星,你就不会删除以前的开始。
if (task.priorityStars == 0)
return
把你的代码改成:
@BindingAdapter("app:setPriority")
fun LinearLayoutCompat.setPriority(task: ToDo) {
val previousStarContainer = findViewWithTag<LinearLayout>("starContainerLayout")
if (previousStarContainer != null) {
removeView(previousStarContainer)
}
if (task.priorityStars == 0)
return
val starContainer = LinearLayout(context)
starContainer.tag = "starContainerLayout"
starContainer.layoutParams = LinearLayoutCompat.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
for (count in 1..task.priorityStars) {
val starView = ImageView(context)
starView.setImageResource(R.drawable.task_star)
starView.layoutParams = LinearLayoutCompat.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
starContainer.addView(starView)
}
addView(starContainer)
}