首页 > 解决方案 > 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()
    }

外观的 GIF

标签: androidkotlinandroid-recyclerviewinsert

解决方案


问题是我在 clicklistener 中观察 liveData,这是主要问题!感谢罗摩克里希纳乔希!

访问答案


推荐阅读