es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agregar un botón en Recyclerview para editar o eliminar datos de la base de datos en tiempo real.

Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código ni la salida en markdownSoy un principiante en programación, así que discúlpeme si mi código es desordenado. Necesito ayuda para completar mi programa.

Estoy usando recyclerview para recuperar algunos datos de la base de datos en tiempo real y quiero agregar el botón de edición y eliminación en el recyclerview para editar y eliminar algunos datos.

Ya creé el botón en el archivo xml, solo que no sé cómo codificar el botón. Ya probé algunos tutoriales de YouTube y consulté algunos códigos en algunas otras publicaciones en Stack Overflow, pero la mayoría de las veces el código me dará un error o el botón no hará nada. A continuación se incluyen mi código y estructura de base de datos:

DoctorViewAdapter.kt

package com.example.patientmonitor

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.android.volley.Request
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import java.util.ArrayList
import kotlin.concurrent.fixedRateTimer

class DoctorViewAdapter(private val patientList : ArrayList<doctorviewpatient>) : RecyclerView.Adapter<doctorviewadapter.doctorviewholder>() {

//WebView
private lateinit var pulseGraph: WebView
private lateinit var temperatureGraph: WebView

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

    val itemView = LayoutInflater.from(parent.context).inflate(R.layout.patient_item,parent,false)
    return DoctorViewHolder(itemView)
    pulseGraph.webViewClient = WebViewClient()
    temperatureGraph.webViewClient = WebViewClient()

    pulseGraph.settings.javaScriptEnabled = true
    temperatureGraph.settings.javaScriptEnabled = true

    pulseGraph.settings.builtInZoomControls = true
    temperatureGraph.settings.builtInZoomControls = true

}

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

    val currentitem = patientList[position]

    holder.userID.text = currentitem.userID
    holder.fullName.text = currentitem.fullName
    holder.userEmail.text = currentitem.email
    holder.phoneNumber.text = currentitem.phoneNumber

    var pulseValue = "null"
    var temperatureValue = "null"
    //get pulse value from thingspeak and set to text view
    val pulsequeue = Volley.newRequestQueue(holder.pulseValue.context)
    val temperaturequeue = Volley.newRequestQueue(holder.temperatureValue.context)
    val pulseRequest = StringRequest(Request.Method.GET, currentitem.pulseValue as String?,
        Response.Listener<string> { response ->
            pulseValue = response
            holder.pulseValue.text = pulseValue
        }, Response.ErrorListener {
            // didn't work
        })

    //get temperature value from thingspeak and set to text view
    val tempRequest = StringRequest(Request.Method.GET, currentitem.temperatureValue as String?,
        Response.Listener<string> { response ->
            temperatureValue = response
            holder.temperatureValue.text = temperatureValue
        }, Response.ErrorListener {
            // didn't work
        })

    //get thingspeak data every 1 second
    fixedRateTimer("timer", false, 0L, 1000) {
        pulsequeue.add(pulseRequest)
        temperaturequeue.add(tempRequest)
    }

}

override fun getItemCount(): Int {
    return patientList.size
}

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

    val userID : TextView = itemView.findViewById(R.id.tvUserID)
    val fullName : TextView = itemView.findViewById(R.id.tvFullName)
    val userEmail : TextView = itemView.findViewById(R.id.tvEmail)
    val phoneNumber : TextView = itemView.findViewById(R.id.tvPhoneNumber)
    val pulseValue : TextView = itemView.findViewById(R.id.tvPulseValue)
    val temperatureValue : TextView = itemView.findViewById(R.id.tvTemperatureValue)

}
}

}

`PatientlistActivity.kt`

package com.example.patientmonitor

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebView
import androidx.appcompat.app.ActionBar
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.firebase.database.*

class PatientListActivity : AppCompatActivity() {

private lateinit var dbref : DatabaseReference
private lateinit var userRecyclerview : RecyclerView
private lateinit var userArrayList : ArrayList
private lateinit var viewPatientBtn : FloatingActionButton
private lateinit var doctorViewAdapter : DoctorViewAdapter

//ActionBar
private lateinit var actionBar: ActionBar

//WebView
private lateinit var pulseView: WebView
private lateinit var tempView: WebView

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_patient_list)

//configure Actionbar //enable back button
actionBar = supportActionBar!!
actionBar.title = “View Patients”
actionBar.setDisplayHomeAsUpEnabled(true)
actionBar.setDisplayShowHomeEnabled(true)

userRecyclerview = findViewById(R.id.patientList)
userRecyclerview.layoutManager = LinearLayoutManager(this)
userRecyclerview.setHasFixedSize(true)

userArrayList = arrayListOf()
getUserData()

}

private fun getUserData() {

//get intent
val assignedDoctor = intent.getStringExtra(“doctorID”)
val currentUserAccess = intent.getStringExtra(“currentUserAccess”)

dbref = FirebaseDatabase.getInstance().getReference(“Users”)
dbref.orderByChild(“assignedDoctor”).equalTo(assignedDoctor).addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()){

for (userSnapshot in snapshot.children){

val user = userSnapshot.getValue(doctorViewPatient::class.java)
userArrayList.add(user!!)

}

userRecyclerview.adapter = DoctorViewAdapter(userArrayList)

}
}

override fun onCancelled(error: DatabaseError) {
TODO(“Not yet implemented”)
}

})

}
}

}

Esta es mi clase de datos
`doctorViewPatient.kt`

data class doctorViewPatient(val userID : String? =null,
val fullName : String? =null,
val email : String? =null,
val phoneNumber : String? =null,
val pulseValue : String? = null,
val temperatureValue : String? = null)
“`
Esta es mi estructura de base de datos en tiempo real

</doctorviewadapter.doctorviewholder>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar funcionalidades de edición y eliminación a los elementos de su RecyclerView, debe modificar la clase DoctorViewAdapter y el archivo de diseño patient_item.xml.

    1. Modificar el archivo de diseño patient_item.xml

    Agregue dos botones en su archivo de diseño patient_item.xml para las funcionalidades de Edición y Eliminación. Por ejemplo:

    <linearlayout ...="">
        <!-- other views here -->
    
        <button android:id="@+id/btnEdit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Editar"></button>
    
        <button android:id="@+id/btnDelete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Eliminar"></button>
    </linearlayout>
    
    1. Modificar la clase DoctorViewAdapter

    Agregue dos interfaces a DoctorViewAdapter para manejar los clics en los botones de Edición y Eliminación:

    interface OnEditClickListener {
        fun onEditClick(position: Int)
    }
    
    interface OnDeleteClickListener {
        fun onDeleteClick(position: Int)
    }
    

    Agregue dos devoluciones de llamada para estas interfaces:

    private var editClickListener: OnEditClickListener? = null
    private var deleteClickListener: OnDeleteClickListener? = null
    
    fun setOnEditClickListener(listener: OnEditClickListener) {
        editClickListener = listener
    }
    
    fun setOnDeleteClickListener(listener: OnDeleteClickListener) {
        deleteClickListener = listener
    }
    

    Actualice el método onCreateViewHolder() para encontrar y establecer los escuchas de clic para los botones de Edición y Eliminación:

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DoctorViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.patient_item, parent, false)
        val holder = DoctorViewHolder(itemView)
    
        // set click listeners for edit and delete buttons
        holder.editButton.setOnClickListener {
            val position = holder.adapterPosition
            if (position != RecyclerView.NO_POSITION) {
                editClickListener?.onEditClick(position)
            }
        }
    
        holder.deleteButton.setOnClickListener {
            val position = holder.adapterPosition
            if (position != RecyclerView.NO_POSITION) {
                deleteClickListener?.onDeleteClick(position)
            }
        }
    
        // set up pulseGraph and temperatureGraph WebView as before
        return holder
    }
    

    Actualice el método onBindViewHolder() para establecer los escuchas de clic en los botones de Edición y Eliminación para cada elemento:

    override fun onBindViewHolder(holder: DoctorViewHolder, position: Int) {
        // bind other views and data as before
    
        // set click listeners for edit and delete buttons
        holder.editButton.setOnClickListener {
            if (editClickListener != null) {
                editClickListener!!.onEditClick(position)
            }
        }
    
        holder.deleteButton.setOnClickListener {
            if (deleteClickListener != null) {
                deleteClickListener!!.onDeleteClick(position)
            }
        }
    }
    
    1. Modificar la clase PatientListActivity

    Actualice el método getUserData() para establecer los escuchas de clic en los botones de Edición y Eliminación para los elementos en el RecyclerView:

    private fun getUserData() {
        // get intent and dbref as before
    
        dbref.orderByChild("assignedDoctor").equalTo(assignedDoctor)
            .addListenerForSingleValueEvent(object : ValueEventListener {
                override fun onDataChange(snapshot: DataSnapshot) {
                    if (snapshot.exists()) {
                        for (userSnapshot in snapshot.children) {
                            // get user data as before
    
                            userArrayList.add(user!!)
    
                            // set edit and delete button click listener for this item
                            doctorViewAdapter.setOnEditClickListener(object : OnEditClickListener {
                                override fun onEditClick(position: Int) {
                                    // handle edit button click for this item
                                }
                            })
    
                            doctorViewAdapter.setOnDeleteClickListener(object : OnDeleteClickListener {
                                override fun onDeleteClick(position: Int) {
                                    // handle delete button click for this item
                                }
                            })
                        }
                        userRecyclerview.adapter = doctorViewAdapter
                    }
                }
                override fun onCancelled(error: DatabaseError) {
                    // handle error as before
                }
            })
    }
    

    Ahora, cuando hace clic en los botones de Edición o Eliminación en cualquier elemento, se activará la devolución de llamada correspondiente en la clase DoctorViewAdapter. Puede manejar estas devoluciones de llamada para editar o eliminar los datos correspondientes de la base de datos en tiempo real.

Comments are closed.