android - RecyclerView 重复(插入)
问题描述
在我的应用程序中,我试图将一个项目添加到我的回收视图中。当我添加 1 个项目并调用 notifyDataSetChanged () 没有问题,只有当我想添加第 2 个项目然后调用相同的方法时,两个添加的项目出现 2 次。如果我添加第 3 个项目,第 1 个添加的项目仍然出现 2 次,第 2 个项目现在出现 3 次,第 3 个添加的项目也出现 3 次。我正在为我的 recyclerview 使用适配器类。
我试过使用 NotifyItemInserted(position-1) 但它没有用。
以下是我的一些代码片段:
我的适配器类
class CategoriesAdapter(var clickListener: CategorieListener): ListAdapter<CategorieModel, CategoriesAdapter.CategorieViewHolder>(CategorieDiffCallback()) {
override fun getItemCount(): Int {
return super.getItemCount()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CategorieViewHolder {
return CategorieViewHolder.from(parent)
}
override fun onBindViewHolder(holder: CategorieViewHolder, position: Int) {
val reis = getItem(position)
holder.bind(reis, clickListener, position)
}
class CategorieViewHolder private constructor(val binding: LayoutCategorieItemBinding) : RecyclerView.ViewHolder(binding.root){
fun bind(categorie: CategorieModel, clickListener: CategorieListener, position: Int?){
binding.categorie = categorie
var card = binding.catCard
itemView.setOnClickListener {
clickListener.onClick(categorie, card)
}
itemView.ib_delete.setOnClickListener {
clickListener.onDeleteClick(categorie, position!!)
}
binding.catCard.transitionName = categorie.naam
}
companion object {
fun from(parent:ViewGroup) : CategorieViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = LayoutCategorieItemBinding.inflate(layoutInflater, parent, false)
return CategorieViewHolder(binding)
}
}
}
class CategorieDiffCallback : DiffUtil.ItemCallback<CategorieModel>() {
override fun areItemsTheSame(oldItem: CategorieModel, newItem: CategorieModel): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: CategorieModel, newItem: CategorieModel): Boolean {
return oldItem == newItem
}
}
class CategorieListener(val clicklistener: (categorie: CategorieModel, view:MaterialCardView?, position:Int?) -> Unit){
fun onClick(categorie: CategorieModel, view: MaterialCardView) = clicklistener(categorie, view, 0)
fun onDeleteClick(categorie: CategorieModel, position: Int) = clicklistener(categorie, null, position)
}
}
我的片段幕后
private fun setAdapter() {
val adap = CategoriesAdapter(CategoriesAdapter.CategorieListener{ categorie, cardview, position ->
if(cardview == null){
deleteCategorie(categorie, position!!)
}else{
findNavController().navigate(CategoriesFragmentDirections.actionCategoriesFragmentToItemTakenFragment(categorie.naam,categorie))
}
})
binding.categories.apply {
layoutManager = LinearLayoutManager(this.context)
adapterobj = adap
adapter = adap
}
}
private fun setCardButtons() {
binding.btnAdd.setOnClickListener {
val categorie = CategorieModel(binding.catName.editText?.text.toString(),null,null, userId,0)
newCategorie(categorie)
}
binding.btnCancel.setOnClickListener {
toggleKeyboard()
}
}
private fun newCategorie(cat: CategorieModel){
//Toast.makeText(requireContext(), categories.size.toString(), Toast.LENGTH_SHORT).show()
model.createCategorie(cat)
model.categorieCreate.observe(viewLifecycleOwner, Observer {response ->
response?.let {
if(response.isSuccessful){
afterCreateActions(response.body()?.result)
}else{
afterErrorActions()
}
}
})
}
private fun afterCreateActions(cat: CategorieModel?) {
categories.add(cat!!)
adapterobj.notifyDataSetChanged()
toggleKeyboard()
toggleForm()
Snackbar.make(binding.mainView, "${cat?.naam} werd succesvol toevoegd!", Snackbar.LENGTH_LONG)
.setAnimationMode(Snackbar.ANIMATION_MODE_FADE)
.show()
}
解决方案
问题是我在 clicklistener 中观察 liveData,这是主要问题!感谢罗摩克里希纳乔希!
访问答案!
推荐阅读
- algorithm - 是 2^n = Ω(2^(n + k)) 对于某个常数 k?
- tensorflow - 将训练图转换为推理图?(删除 TF 中的批量标准化)
- javascript - javascript ImageData 复制或移动性能
- c# - ASP NET Http 模块在异常之前没有收到大请求
- android - 找不到“android.permission.INTERNET”权限到应该使用它的著名方法的映射
- spring-boot - 如何在 Spring Boot 中正确配置 ldap 身份验证?每次我登录时,它都会在调用 /auth 后重定向到 /login
- git - 将发布分支合并到主分支,同时排除 CI 条目
- dart - Dart - 双数据类型添加导致长十进制值
- c# - 使用 WebRequest 方法在 C# 中发送 JSON POST - 错误?
- google-apps-script - 将对话框响应复制到单元格