When I delete an item in recyclerview and then add a new item, the items I deleted appear again in my Android App.How can I fix it? Any solution?

Viewed 139

When I delete an item in recyclerview and then I add a new item, the items I deleted appear again on my Android app. I used the init in my Adapter to call the setonClickLister. I think that I need to call this code in my Activity but how will ı do ? I use the kotlin and how can ı fix it ? I shared my adapter code below to see clearly, thanx

class NoteAdapter(private var titleText: ArrayList<String>, private var imageButton: ArrayList<String>, private var noteText: ArrayList<String>) : RecyclerView.Adapter<NoteAdapter.ViewHolder>() {


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

        val itemTitle : TextView = itemView.findViewById(R.id.recyclerTitleText)
        val itemImage : ImageView = itemView.findViewById(R.id.recyclerImage)
        val itemDelete : ImageView = itemView.findViewById(R.id.delete)


        init {

            itemView.setOnClickListener { v: View ->


               // Toast.makeText(itemView.context,"You clicked on item # ${position + 1}", Toast.LENGTH_SHORT).show()
                val intent = Intent(itemView.context, PastNotesActivity::class.java)
                intent.putExtra("oldTitle", titleText[position])
                intent.putExtra("oldNote", noteText[position])
                intent.putExtra("oldImage", imageButton[position])
                itemView.context.startActivity(intent)

            }

            itemDelete.setOnClickListener { v: View ->

                titleText.removeAt(position)
                imageButton.removeAt(position)
                notifyItemRemoved(position)

            }
        }
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

        val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_row, parent, false)
        return ViewHolder(v)
    }

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

        holder.itemTitle.text = titleText[position]
        Picasso.get().load(imageButton[position]).resize(150,150).into(holder.itemImage)

    }

    override fun getItemCount(): Int {

        return titleText.size
    }

    

}

by the way, ı tried this code, but it does not work

notifyItemRemoved(position)
notifyItemRangeChanged(position, titletext.size)
2 Answers

Put button click inside onBindViewHolder:

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

    holder.itemTitle.text = titleText[position]
    Picasso.get().load(imageButton[position]).resize(150,150).into(holder.itemImage)

     val itemDelete : ImageView = itemView.findViewById(R.id.delete)

     itemDelete.setOnClickListener { v: View ->

            titleText.removeAt(position)
            imageButton.removeAt(position)
            notifyItemRemoved(position)

        }

}

I have some suggests:

-You shouldn't use inner ViewHolder like that.

-And clarify your activity, adapter and viewholder.

-Create your own Listener or a callback function to handle the action from the viewholder.

-Create your data class/map/... to manage or store your data, shouldn't use like that.

Related