user24907272
user24907272

Reputation: 1

Filtering recyclerviews

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

Answers (0)

Related Questions