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.

Android – filtrar datos de una base de datos en un adaptador.

Estoy aprendiendo Kotlin y estoy tratando de filtrar algunos datos que provienen directamente de una base de datos (room) en mi adaptador para mostrarlos.

Aquí está mi código (desde dentro del fragmento, que contiene un RecyclerView con un adaptador):

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
val adapter = LatestReleaseListAdapter {
}
binding.recyclerView.layoutManager = LinearLayoutManager(this.context)
binding.recyclerView.adapter = adapter

viewModel.allItems.observe(this.viewLifecycleOwner) { items ->
    // Aquí me gustaría eliminar los elementos que ya han sido vistos
    items.filter { item -> !item.hasBeenSeen }
    items.let {
        adapter.submitList(it)
    }
}  

“`

El código es bastante sencillo como puedes ver. Simplemente estoy tratando de filtrar los elementos de la lista donde el booleano “hasBeenSeen” es true. Solo quiero mostrar aquellos donde el booleano “hasBeenSeen” es false. ¿Cómo puedo lograr eso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, necesitas almacenar la lista filtrada en una variable antes de enviarla al adaptador. Actualmente, tu función de filtro no se está guardando en ningún lugar.

    Aquí te muestro cómo puedes modificar tu código para filtrar la lista:

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        val adapter = LatestReleaseListAdapter {
        }
        binding.recyclerView.layoutManager = LinearLayoutManager(this.context)
        binding.recyclerView.adapter = adapter
    
        viewModel.allItems.observe(this.viewLifecycleOwner) { items ->
            // Almacena la lista filtrada en una variable separada
            val filteredItems = items.filter { item -> !item.hasBeenSeen }
    
            // Envía la lista filtrada al adaptador
            adapter.submitList(filteredItems)
        }
    }
    

    En este código modificado, primero filtramos la lista items utilizando la función filter y guardamos la lista resultante en filteredItems. Luego, enviamos esta lista filteredItems al adaptador utilizando adapter.submitList(). De esta manera, solo se mostrarán en el RecyclerView los elementos con hasBeenSeen configurado en false.

    Espero que esto te ayude. Avísame si tienes alguna pregunta adicional.

Comments are closed.