首页 > 解决方案 > 如何更新仅在 Recyclerview 适配器上单击的项目而不是最后一个可见的项目?

问题描述

我之前问过这个问题,经过一番调查后,我知道我的 onBindViewHolder 更新了我列表中的错误项目。这是什么意思?例如,我按下列表中的第 0 项,它将更新第 6 项的视图。我不知道为什么会这样,因为我之前认为这notifyItemChanged()会改变点击的项目而不是我列表中最后一个可见的项目。我的适配器类:

open class JobsAdapter(private val jobs: ArrayList<JobModel>, private val ctx: Context, private val click: Click) : RecyclerView.Adapter<JobsAdapter.JobsHolder>() {
    lateinit var view: View


    override fun onCreateViewHolder(viewGroup: ViewGroup, p1: Int): JobsHolder {
        view = LayoutInflater.from(viewGroup.context).inflate(R.layout.job_list_item, viewGroup, false)
        return JobsHolder(view)
    }

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


    override fun onBindViewHolder(holder: JobsHolder, position: Int) {
        val jobModel = jobs[position]
        holder.tvPosition.text = jobModel.position
        holder.tvAddress.text = jobModel.location
        holder.tvCompany.text = jobModel.company_name

        holder.itemView.setOnClickListener {
            if (!jobModel.isSeen) {
                    Singleton.clickReq(jobModel.id, ctx)

            }

            holder.itemView.background = ContextCompat.getDrawable(ctx, R.drawable.message_list_item_bg)

            click.sendData(Uri.parse(jobModel.job_link).toString(), holder.adapterPosition, jobModel.position!!)
        }

        holder.ivAddTo.setOnClickListener {
            holder.progressBar.visibility = View.VISIBLE
            holder.ivAddTo.setBackgroundResource(R.drawable.added_to_notepad)
            holder.ivAddTo.visibility = View.GONE
            holder.ivAddTo.isClickable = false
            Singleton.jobLstPos = position



                saveToNotepad(jobModel.id)
        }


        if (jobModel.isSeen) {
            holder.itemView.background = ContextCompat.getDrawable(ctx, R.drawable.message_list_item_bg)
        } else {
            holder.itemView.setBackgroundColor(Color.parseColor("#fafafa"))
        }
    }

    override fun onBindViewHolder(holder: JobsHolder, position: Int, payloads: List<Any>) {
        if (payloads.isNotEmpty()) {
            when (payloads[0]) {
                1 -> {
                    holder.ivAddTo.visibility = View.GONE
                }
            }
        } else {
            super.onBindViewHolder(holder, position, payloads)
        }
    }

    private fun saveToNotepad(id: Int) {
        Singleton.apiService(ctx).saveTo("Bearer " + ctx.getSharedPreferences("appD", 0).getString("access_token", ""), id).enqueue(object : Callback<SaveTo> {
            override fun onResponse(call: Call<SaveTo>, response: Response<SaveTo>) {
                if (response.isSuccessful) {
                    notifyItemChanged(view.getTag(R.id.tag_3) as Int, 1)
                } 
            }

            override fun onFailure(call: Call<SaveTo>, t: Throwable) {
            }
        })
    }

    class JobsHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var tvCompany = itemView.findViewById<TextView>(R.id.tv_company)!!
        var tvDate = itemView.findViewById<TextView>(R.id.tv_date)!!
        var tvPosition = itemView.findViewById<TextView>(R.id.tv_job_title)!!
        var tvAddress = itemView.findViewById<TextView>(R.id.tv_address)!!
        var ivAddTo = itemView.findViewById<ImageView>(R.id.add_to_notepad)!!
        var progressBar = itemView.findViewById<ProgressBar>(R.id.progressBar)
    }
}

单击添加按钮后,我发送请求,如果成功,我想停止进度条,更改其可见性并更改单击的 btn 的背景。那么,为什么会发生这种情况以及如何解决这个问题?

标签: androidandroid-recyclerview

解决方案


我设法通过添加用于更新视图的特殊功能来解决我的问题:

fun changeView(position: Int, permission: Boolean) {
        notifyItemChanged(position, permission)
    }

然后onBindViewHolder()

override fun onBindViewHolder(holder: JobsHolder, position: Int, payloads: List<Any>) {
        if (payloads.isNotEmpty()) {
            when (payloads[0]) {
                true -> {
                    holder.ivAddTo.setBackgroundResource(R.drawable.added_to_notepad)
                    holder.progressBar.visibility = View.GONE
                    holder.ivAddTo.visibility = View.VISIBLE
                }
                false->{
                    holder.progressBar.visibility = View.GONE
                    holder.ivAddTo.visibility = View.VISIBLE
                }
            }
        } else {
            super.onBindViewHolder(holder, position, payloads)
        }
    }

也许它会帮助其他人。


推荐阅读