android - 如何更新仅在 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 的背景。那么,为什么会发生这种情况以及如何解决这个问题?
解决方案
我设法通过添加用于更新视图的特殊功能来解决我的问题:
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)
}
}
也许它会帮助其他人。
推荐阅读
- ruby-on-rails - 在谷歌云上运行的 Rails 5 应用程序通过套接字运行到谷歌云 SQL 实例的 ConnectionBad 问题
- ios - SwiftUI 中的自定义模态转换
- c# - 如何制作“全局”wpf 应用程序热键
- amazon-web-services - AWS Cognito Identity 用户 ID 或用户池用户 ID?使用哪个?
- java - 暂停代码,直到用户在对话框提示上输入数据
- c# - 如果我有管理员政策,请添加其他政策
- python - 功能正常工作,除了通过另一个模块,没有明显的原因
- python - 仅当消息匹配时 Python 才捕获异常
- python - 为什么while一直在这里循环?有人可以解释一下吗?
- javascript - 将画布中上传的图像保存到服务器