在RecyclerView项目中添加Some View会产生一个已知的BUG。

问题描述 投票:-1回答:1

因此,我正在创建一个todo应用程序,用户可以设置优先级,优先级的星星通过绑定适配器以编程方式添加,但当滚动任务回收器视图时,星星数量为零的任务也显示星星,而检查日志显示零星星。此外,这个错误只发生在我滚动到有星星的项目,然后开始严格滚动时

  1. 应用程序刚刚开始

enter image description here

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

enter image description here

  1. 严格滚动后

enter image description here

我试着在每次更新项目时创建新的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)

}
android arraylist android-recyclerview android-livedata android-binding-adapter
1个回答
0
投票

回收器回收视图:) - 它使用同一个视图来显示多个数据! 这意味着一个视图可以用来显示一个带有星星的对象--如此而已。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)

}
© www.soinside.com 2019 - 2024. All rights reserved.