-1

因此,我正在创建一个待办事项应用程序,用户可以在其中设置优先级,并且通过绑定适配器以编程方式添加优先级星,但是当滚动任务回收器视图时,星数为零的任务也显示星数,其中检查日志显示零星。此外,仅当我滚动到带有星星的项目然后开始严格滚动时才会出现此错误

  1. 应用程序刚刚启动

在此处输入图像描述

  1. 滚动到带有任务星的项目

在此处输入图像描述

  1. 严格滚动后

在此处输入图像描述

我试过创建新的 ArrayList 每次更新项目

片段代码:

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)

}
4

1 回答 1

0

Recycler 回收视图 :) - 它使用相同的视图来显示多个数据!这意味着可以使用视图来显示带有星星的对象 - 所以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)

}
于 2020-05-14T08:22:33.303 回答