Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Incrementando o desafio da lista ordenada com Coroutines

Bom dia a todos

Na aula final do curso anterior: Android com Kotlin: Migrations e relacionamento com o Room foi proposto um desafio de configuração para organizar a lista.

Após o curso de coroutines não vi a lista adaptada para coroutines, então quebrei um pouco a minha cabeça, passei um tempinho, mas consegui adaptar a atualização da lista com ajuda do lifecycleScope e fazendo o when em uma função suspended separada:

Na ProdutoDao 
    @Query("SELECT * FROM PRODUTO ORDER BY nome DESC")
    fun organizaTodosPorNomeDesc(): Flow<List<Produto>>

    @Query("SELECT * FROM  PRODUTO ORDER BY nome ASC")
    fun organizaTodosPorNomeAsc(): Flow<List<Produto>>

    @Query("SELECT * FROM  PRODUTO ORDER BY descricao DESC")
    fun organizaTodosPorDescricaoDesc(): Flow<List<Produto>>

    @Query("SELECT * FROM PRODUTO ORDER BY descricao ASC")
    fun organizaTodosPorDescricaoAsc(): Flow<List<Produto>>

    @Query("SELECT * FROM  PRODUTO ORDER BY preco DESC")
    fun organizaTodosPorPrecoDesc(): Flow<List<Produto>>

    @Query("SELECT * FROM  PRODUTO ORDER BY preco ASC")
    fun organizaTodosPorPrecoAsc(): Flow<List<Produto>>

    @Query("SELECT * FROM  PRODUTO ORDER BY id ASC")
    fun organizaTodosPeloMaisAntigo(): Flow<List<Produto>>

    @Query("SELECT * FROM  PRODUTO ORDER BY id DESC")
    fun organizaTodosPeloMaisNovo(): Flow<List<Produto>>
}
Na class ListaProdutosActivity:
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_listar_produtos,menu)
        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
            lifecycleScope.launch {
               ordenaListaProdutos(item)?.let {
                    adapter.atualiza(it)
                }
            }
        return super.onOptionsItemSelected(item)
    }

    private suspend fun ordenaListaProdutos(item: MenuItem): List<Produto>? {
        val produtoOrdenado: List<Produto>? =
            when (item.itemId) {
                R.id.menu_listar_produtos_ordernar_botao_nome_desc ->
                         produtoDao.organizaTodosPorNomeDesc().firstOrNull()
                R.id.menu_listar_produtos_ordernar_botao_nome_asc ->
                        produtoDao.organizaTodosPorNomeAsc().firstOrNull()
                R.id.menu_listar_produtos_ordernar_botao_descricao_desc ->
                        produtoDao.organizaTodosPorDescricaoDesc().firstOrNull()
                R.id.menu_listar_produtos_ordernar_botao_descricao_asc ->
                        produtoDao.organizaTodosPorDescricaoAsc().firstOrNull()
                R.id.menu_listar_produtos_ordernar_botao_preco_desc ->
                         produtoDao.organizaTodosPorPrecoDesc().firstOrNull()
                R.id.menu_listar_produtos_ordernar_botao_preco_asc ->
                         produtoDao.organizaTodosPorPrecoAsc().firstOrNull()
                R.id.menu_listar_produtos_ordernar_botao_mais_antigo ->
                         produtoDao.organizaTodosPeloMaisAntigo().firstOrNull()
                R.id.menu_listar_produtos_ordernar_botao_mais_novo ->
                         produtoDao.organizaTodosPeloMaisNovo().firstOrNull()
                else -> null
            }
        return produtoOrdenado

Ps: se tiver alguma correcao ou melhoria, pode deixar nos comentários

Ps2: eu tomei uma liberdade criativa e meu projeto não é sobre produtos. Eu alterei os nomes aqui no fórum para ficar mais fácil para quem for replicar o código. se tiver algum erro de digitação, pode me avisar que eu corrijo

1 resposta
solução!

Olá, Murilo!

Parabéns por ter adaptado a atualização da lista com o uso de coroutines! É sempre bom ver que os conhecimentos adquiridos em um curso estão sendo aplicados em outros projetos.

Pelo que pude entender, você utilizou o lifecycleScope para lançar a ordenação da lista de produtos em uma função suspensa separada. Isso é uma ótima prática, pois evita que a UI fique travada enquanto a ordenação é realizada.

Além disso, você utilizou o Flow para retornar a lista de produtos ordenada. O uso do Flow é uma forma eficiente de trabalhar com dados assíncronos no Room, pois ele permite que os dados sejam emitidos de forma assíncrona e reativa.

Não encontrei nenhum erro no código que você postou, mas se você tiver alguma dúvida ou precisar de alguma ajuda, pode contar comigo.

Espero ter ajudado e bons estudos!