J'ai créé une vue de recyclage et à l'intérieur qui utilise la vue de carte pour les éléments. J'ai un bouton Supprimer dans une vue de carte chaque fois que je clique sur ce bouton mon article est supprimé de la base de données SQLITE. Mais pour le refléter sur l'interface utilisateur, l'application doit redémarrer. Comment puis-je informer l'ADPATER que l'élément est supprimé?
Activity_Main.xml P>
package com.example.passwordmanager
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.list_item_layout.view.*
class CredentialAdapter(
private val items: List<CredentialsModel>,
ctx: Context, val clickListener: (CredentialsModel) -> Unit
): RecyclerView.Adapter<CredentialAdapter.ViewHolder>() {
var context = ctx
class ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){
fun bind(credential: CredentialsModel,clickListener: (CredentialsModel) -> Unit){
itemView.urlView.text = credential.url
itemView.userNameView.text = credential.userName
itemView.passwordView.text = credential.password
itemView.noteView.text = credential.note
itemView.delButton.setOnClickListener{clickListener(credential)}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item_layout,parent,false))
}
override fun getItemCount(): Int {
return items.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val credential:CredentialsModel = items[position]
holder.bind(credential,clickListener)
}
}
4 Réponses :
Ajouter Supprimer SetonClickListener dans votre ONBindviewholder.
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.remove.setOnClickListener {
val db = DataBaseHandler(this)
if(db.deleteData(credential.id)){
notifyItemRemoved(holder.getAdapterPosition())
}
}
}
J'ai eu une erreur chez tituly.remove, est supprimer un identifiant de bouton de suppression?
Dans votre cas, Delbutton.
ok donc, je dois supprimer SetonClickListner de la fonction de liaison à l'intérieur de la vue Viewholder?
Je ne sais pas pourquoi il montre une erreur pour Removeat code>. J'essaie d'utiliser goutte code>, mais puis de l'élément que je suppose fusionner à la fin de la liste.
Je pense que j'utilise la seule liste, je vais essayer avec une liste mutable.
désolé de vous interrompre à nouveau. J'ai eu une erreur à val db = base de donnéesHandlerdler (this) code> alors j'utilise context code> au lieu de Ceci code> mais que l'élément supprimé est supprimé de la base de données mais non reflétant sur l'interface utilisateur.
Après avoir utilisé notifierItemremoved code> Utiliser notifierItemRangechanged code>
Quels paramètres doivent être passés?
Changer de paramètre de mutableliste en arraylist fait le travail ..... Merci ... !!!
Vous supprimez l'élément de la base de données, mais pas de la liste Inside RecyclERView Adapter.
fun deleteClick(credential: CredentialsModel, position: Int) {
val db = DataBaseHandler(this)
if(db.deleteData(credential.id)){
adapter.remove(position)
Toast.makeText(applicationContext,"Deleted", Toast.LENGTH_SHORT).show()
}
}
Solution de @s T travaille pour moi lorsque je modifie Type de liste de Mutablelist vers ArrayList. Merci de suggérer une liste de formulaires de conversion sur ArrayList
La meilleure façon de gérer ces types de situations est d'utiliser Liveta .
LiveData est essentiellement une classe observable qui lit uniquement des données uniquement lorsqu'il y a un changement.
Ce que vous pouvez faire est de créer une fonction définie dans votre adaptateur comme: maintenant dans votre activité principale / fragment, créez une liste LiveTata en dehors de la fonction Oncreate comme suit: P> allData.observe(this, Observer { data->
data?.let { adapter.setData(it) }
})
Assurez-vous d'utiliser le diffutil dans l'adaptateur;)
Utilisez LISTADPATER
class AdapterMain(var onClickListener: (Int) -> Unit) :
ListAdapter<Note, AdapterMain.NoteViewHolder>(DIFFCALBACK) {
companion object DIFFCALBACK : DiffUtil.ItemCallback<Note>() {
override fun areItemsTheSame(oldItem: Note, newItem: Note): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Note, newItem: Note): Boolean {
return oldItem.title == newItem.title &&
oldItem.description == newItem.description &&
oldItem.priority == newItem.priority
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.note_item, parent, false)
return NoteViewHolder(view)
}
override fun onBindViewHolder(holder: NoteViewHolder, position: Int) {
holder.txtTitle.text = getItem(position).title
holder.txtDesc.text = getItem(position).description
holder.txtPriority.text = getItem(position).priority.toString()
}
inner class NoteViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var txtTitle: TextView = itemView.txt_title
var txtDesc: TextView = itemView.txt_desc
var txtPriority: TextView = itemView.txt_priority
init {
itemView.setOnClickListener { onClickListener(adapterPosition) }
}
}
fun getNoteAt(position: Int): Note {
return getItem(position)
}