Reputation: 1
I am having a problem filtering the recyclerviews
. The filter works but the original list is modified and there comes a point where it is emptied. How can I fix this?
I have tried all the ways. In addition to this... is it better to do all this in the adapter
or in the viewmodel
?
Thank you all in advance
class AdaptadorRutas(
private var listarutasOriginal: List<Ruta>,
private val misRutas: Boolean,
) : RecyclerView.Adapter<AdaptadorRutas.ViewHolder>() {
//Declaración de variables
private val firestore = App.getFirestore()
private val auth = App.obtenerAuth()
private lateinit var context: Context
private val dateFormat=SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
inner class ViewHolder(val binding: RutaItemBinding) : RecyclerView.ViewHolder(binding.root) {
//Asignamos los valores de la ruta a las vistas que cuelgan del viewholder
fun conectar(ruta: Ruta) {
val uidUsuario= auth.currentUser?.uid
val rutaMia=uidUsuario == ruta.uid_creador
val fecha_inicio=dateFormat.format(ruta.fecha_inicio)
val fecha_fin=dateFormat.format(ruta.fecha_fin)
binding.tvTitulo.text = ruta.titulo
binding.tvUsuario.text = ruta.creador
binding.tvInicio.text = fecha_inicio.toString()
binding.tvFin.text = fecha_fin.toString()
binding.tvProvinciasalida.text = ruta.provincia
binding.tvPuntosalida.text = ruta.punto_salida
binding.tvDescripcion.text = ruta.descripcion
Log.d("Adap","provinciaFirebase ${ruta.provincia}")
// Para la gestión de imágenes utilizamos la libreria Glide
Glide
.with(binding.root)
.load(ruta.Url_maparuta)
.centerCrop()
.into(binding.rutaMap);
//Listener para abrir la actividad que muestra la imagen completa de la ruta
binding.rutaMap.setOnClickListener {
val ruta = listarutasOriginal[adapterPosition]
mapaCompleto(ruta.Url_maparuta, rutaMia)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
context = parent.context
val inflater = LayoutInflater.from(parent.context)
val binding = RutaItemBinding.inflate(inflater, parent, false)
return ViewHolder(binding)
}
//Numero de elementos de la lista
override fun getItemCount(): Int {
return listarutasOriginal.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.conectar(listarutasOriginal[position])
//Listener para ir a la actividad en el caso que queramos editar la ruta
holder.itemView.setOnClickListener {
val rutaAEditar = listarutasOriginal[position]
val intent = Intent(holder.itemView.context, EditRutasActivity::class.java)
.apply {
putExtra("rutaAEditar", rutaAEditar)
}
holder.itemView.context.startActivity(intent)
}
//Listener para coger la opción de eliminar la ruta
holder.itemView.setOnLongClickListener { ruta ->
if (misRutas){
mostrarAviso(listarutasOriginal[position])
}
true // Indicamos que se maneja el evento de clic largo
}
}
//función para ir actualizando la lista de rutas a mostrar y notificar cambios al adapter
fun actualizarRutas(nuevaListaRutas: List<Ruta>) {
listarutasOriginal=nuevaListaRutas
notifyDataSetChanged()
}
//Función que muestra el aviso de borrado y llama a la función de borrar
private fun mostrarAviso(ruta: Ruta) {
val builder = AlertDialog.Builder(context)
builder.setTitle("Borrado de rutas")
builder.setMessage("Está segur@ que desea borrar la ruta?")
builder.setPositiveButton("SI") { _, _ ->
borrarRuta(ruta)
}
builder.setNegativeButton("Cancelar") { _, _ ->
}
val dialog = builder.create()
dialog.show()
}
//Función que elimina la ruta de Firebase
private fun borrarRuta(ruta: Ruta) {
val uidUser = auth.currentUser?.uid
val rutaRef = firestore.collection(Constantes.RUTAS)
.whereEqualTo("titulo", ruta.titulo)
.whereEqualTo("uid_creador", uidUser)
.limit(1)
rutaRef.get()
.addOnSuccessListener { documents ->
for (document in documents) {
document.reference.delete()
.addOnSuccessListener {
Toast.makeText(context,"La ruta ha sido eliminada",
Toast.LENGTH_SHORT).show()
}
.addOnFailureListener { exception ->
Toast.makeText(context,"No se ha encontrado la ruta",
Toast.LENGTH_SHORT).show()
}
break // Solo necesitamos eliminar una ruta,
// break rompe el bucle después de encontrar una coincidencia
}
}
.addOnFailureListener { exception ->
Toast.makeText(context,"Error al eliminar la ruta",
Toast.LENGTH_SHORT).show()
}
}
//Función para mostrar la imagen tamaño completo del mapa
private fun mapaCompleto(Url_maparuta: String,rutaMia:Boolean) {
val intent = Intent(context, MapaCompletoActivity::class.java)
.apply {
putExtra("Url_maparuta", Url_maparuta)
putExtra("rutaMia",rutaMia)
}
context.startActivity(intent)
}
fun filter(provincia: String){
val listaFitlrada = listarutasOriginal.filter { ruta->
ruta.provincia.contains(provincia)
}
listarutasOriginal= listaFitlrada.toMutableList()
notifyDataSetChanged()
}
}
Upvotes: 0
Views: 16