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