android - 在 Recyclerview 中错误地运行 onBindViewHolder - Kotlin

标签 android kotlin android-recyclerview

我正在尝试处理我的 recyclerview,但出现了问题 当我向下滚动时(onBindView 函数)工作正常 但是当滚动回 recyclerview 中的第一个项目时,一切都变得错误,如下图所示。

   package com.leaderspro.mrlawyer.adapters

import android.graphics.Paint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.leaderspro.mrlawyer.R
import com.leaderspro.mrlawyer.models.TODOModel
import kotlinx.android.synthetic.main.todo_list.view.*


class TODOAdapter(private val mArray: ArrayList<TODOModel>) :
    RecyclerView.Adapter<TODOAdapter.ViewHolder>() {

    var mView: View? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        mView = LayoutInflater.from(parent.context).inflate(R.layout.todo_list, parent, false)

        return ViewHolder(mView!!)
    }

    override fun getItemCount(): Int {
        return mArray.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {


        val mTODO = mArray[position]



            if (mTODO.isDone == 0) {//not complete
                holder.ivIsDone.setImageResource(R.drawable.ic_checkbox_unchecked)
            } else if (mTODO.isDone == 1) {
                holder.ivIsDone.setImageResource(R.drawable.ic_checkbox_checked)
                holder.tvTodoTask.paintFlags =
                    holder.tvTodoTask.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG //put line on done Tasks
            }

        holder.tvTodoTask.text = mTODO.task
        holder.tvTODODate.text = mTODO.date

    }


    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        val tvTodoTask = itemView.tvTodoTask!!
        val tvTODODate = itemView.tvTODODate!!
        val ivIsDone = itemView.ivIsDone!!

        val todoListMainLinear = itemView.todoListMainLinear!!

    }
}

工作正常 /image/6mBUJ.png

工作正常 /image/qcpLK.png

回滚时错误地调用了onBindView /image/2sRsu.png

最佳答案

使用 holder.adapterposition 代替 position

val mTODO = mArray[holder.adapterposition]

更多信息请查看:https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.Adapter.html?hl=en#onBindViewHolder(VH,%20int)

编辑: 正如@Pawel 指出的那样,当 mTodo.isDone == 0 时应清除标志。

应该可以完成工作

关于android - 在 Recyclerview 中错误地运行 onBindViewHolder - Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59519303/

相关文章:

java - 当我导入 Settings.System currentTimeMillis 时不再工作

android - 当 RecyclerView 上方的顶部菜单可见然后消失时,RecyclerView 会松开之前的位置并跳转到零位置

android - 通过蓝牙接收消息到 raspberrypi

java - 为什么我无法使用 Gson 从 json 获取嵌套数据?

android - 将 iOS 框架 (Swift/Objective-C) 导入到 Android 应用程序项目中?

android - 当应用程序从后台恢复时自动更改抽屉语言

android - 我想一次滚动多个回收器 View 如何实现

java - 回收站 View : last item's animation on notifyItemRemoved()

android - 如何在没有资源的情况下创建资源 ID

java - 如何重复发布和接收数据但使应用程序仍然负责编辑