You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
uma das tarefas mais comuns quando desenvolvemos aplicações Android é exibir informações na forma de lista, como uma lista de produtos, de contatos, de mensagens etc.
anteriormente ao Jetpack Compose utilizávamos um componente chamado RecyclerView, bastante trabalhoso.
hoje, a construção desses componentes se tornou simples com a utilização dos composables LazyColumn e LazyRow.
exploraremos a utilização do LazyColumn.
criar um projeto no Android Studio chamado Listas Lazy e apagar as funções Greeting e GreetingPreview.
criar 2 pacotes: model e repository.
no pacote model, criar uma classe de dados chamada "Game".
no pacote repository, criar um arquivo "GamesList.kt".
packagebr.com.fiap.listaslazy.repositoryimportbr.com.fiap.listaslazy.model.GamefungetAllGames(): List<Game> {
returnlistOf(
Game(id =1, title ="Double Dragon", studio ="Technos", releaseYear =1987),
Game(id =2, title ="Batletoads", studio ="Tradewest", releaseYear =1991),
Game(id =3, title ="Enduro", studio ="Activision", releaseYear =1983),
Game(id =4, title ="Ikari Warriors", studio ="SNK", releaseYear =1986),
Game(id =5, title ="Captain Commando", studio ="Capcom", releaseYear =1991),
Game(id =6, title ="Mario Bros", studio ="Nintendo", releaseYear =1983),
Game(id =7, title ="Tiger Heli", studio ="Taito", releaseYear =1985),
Game(id =8, title ="Mega Man", studio ="Capcom", releaseYear =1987),
Game(id =9, title ="Gradius", studio ="Konami", releaseYear =1985),
Game(id =10, title ="Gun Fight", studio ="Taito", releaseYear =1975)
)
}
fungetGamesByStudio(studio:String): List<Game>{
return getAllGames().filter {
it.studio.startsWith(prefix = studio, ignoreCase =true)
}
}
o arquivo GamesList.kt implementa a função getAllGames(), que retorna uma lista com dez games e a função getGamesByStudio(), que retorna uma lista de games cujo nome do estúdio começa com o valor do argumento studio, ignorando maiúsculas e minúsculas.
criar a interface do usuário (arquivo MainActivity.kt):
podemos criar listas utilizando Column em conjunto com algum laço de repetição, mas isso deve ser feito para exibir listas pequenas, para evitar problemas de performance.
quando trabalhamos com listas muito grandes, a melhor opção é a utilização da LazyColumn, que posiciona na lista apenas os itens visíveis, e o restante da lista vai sendo inserido de acordo com a rolagem da lista, garantindo uma performance superior.
implementar a função GamesScreen no arquivo MainActivity.kt:
para implementar a funcionalidade de busca, é necessário controlar o estado da aplicação, tanto para a digitação no campo de busca quanto para a lista de games.
criar as variáveis de estado no início da função GameScreen.
@OptIn(ExperimentalMaterial3Api::class)
@Composable
funGamesScreen() {
var searchTextState by remember {
mutableStateOf("")
}
var gamesListState by remember {
mutableStateOf(getAllGames())
}
}
outro ajuste que deve ser feito é passar o estado para a função "items" da LazyColumn:
uma API REST funciona seguindo o modelo cliente-servidor, ou seja, temos um cliente que faz uma requisição solicitando algum recurso e o servidor atende essa requisição fornecendo o recurso requisitado.
os recursos podem ser imagens, arquivos HTML ou simplesmente texto.
geralmente os recursos envolvidos tanto na requisição quanto na resposta em um webservice HTTP usando o padrão REST são textos em formato JSON ou XML.
2.2 A biblioteca Retrofit
é uma das bibliotecas mais populares para consumo de APIs REST no Android, fornecendo uma forma rápida, eficiente e segura de executar requisições HTTP e fácil gerenciamento das respostas.
essa biblioteca nos permite trabalhar com os formatos de dados mais utilizados como o JSON e XML, sendo o JSON o formato dominante.
a conversão de objetos para JSON e vice e versa é feito de maneira transparente ao desenvolvedor através da utilização de diversos conversores disponíveis, como Gson, Jackson, Moshi etc.
2.3 Projeto Consulta CEP
o projeto realizará a consulta em uma API pública responsável por devolver os dados de um endereço a partir de um CEP ou através de uma parte do endereço conhecido, como nome da rua, cidade, estado etc.U
porém, não utilizaremos todos os atributos da resposta, e alguns nomes que utilizamos na classe Endereco é diferente do nome do atributo que recebemos do ViaCep.
é importante que o nome dos atributos na classe seja igual aos nomes dos atributos do JSON da resposta que recebemos!
agora que temos a biblioteca Retrofit disponível no projeto, fazer alguns ajustes na classe de dados “Endereco” para que tudo funcione corretamente.
a interface CepService possui dois métodos de requisição GET, por conta da anotação @GET, que recebe como argumento a parte da URL que é específica para cada requisição.
ambos os métodos retornam um objeto do tipo Call, que contém a resposta do servidor REST da ViaCep.
a anotação @Path indica que a chave que se encontra na URL deverá ser substituída pelo valor do argumento passado na chamada do método.
criar uma classe chamada RetrofitFactory no pacote service, que fará o papel de cliente HTTP (ela que fará as requisições para o servidor da ViaCep).
a variável URL armazena a URL base (parte que é fixa para qualquer requisição ao webservice), e o restante da URL será fornecido pela anotação @GET da interface que possui os métodos de requisição que serão utilizados.
2.3.2 Executando as chamadas para a API
executar a chamada para o endpoint da ViaCep responsável por nos entregar uma lista de endereços quando fornecemos o estado, a cidade e parte do nome da rua.
o método que vamos utilizar será o getEnderecos(), que nos devolve uma lista de endereços com base no estado, cidade e rua fornecidos pelo usuário.
criar uma variável de estado que guardará a lista de endereços devolvidos pela API.
@OptIn(ExperimentalMaterial3Api::class)
@Composable
funCepScreen() {
var cepState by remember { mutableStateOf("") }
var ufState by remember { mutableStateOf("") }
var cidadeState by remember { mutableStateOf("") }
var ruaState by remember { mutableStateOf("") }
var listaEnderecoState by remember { mutableStateOf(listOf<Endereco>()) }
}
implementar a chamada (Call) para o servidor da ViaCep. Faremos a chamada no clique do segundo botão “buscar”.
Row(verticalAlignment =Alignment.CenterVertically) {
OutlinedTextField(
value = ruaState,
onValueChange = {
ruaState = it
},
modifier =Modifier.weight(2f),
label = {
Text(text ="O que lembra do nome da rua?")
},
keyboardOptions =KeyboardOptions(
keyboardType =KeyboardType.Text,
capitalization =KeyboardCapitalization.Words
)
)
IconButton(onClick = {
val call =RetrofitFactory().getCepService().getEnderecos(ufState, cidadeState, ruaState)
call.enqueue(object:Callback<List<Endereco>>{
overridefunonResponse(
call:Call<List<Endereco>>,
response:Response<List<Endereco>>
) {
listaEnderecoState = response.body()!!
}
overridefunonFailure(call:Call<List<Endereco>>, t:Throwable) {
TODO("Not yet implemented")
}
})
}) {
Icon(imageVector =Icons.Default.Search, contentDescription ="")
}
}
no código acima, criamos um objeto Call para o método getEnderecos da interface CepService, onde passamos o estado, cidade e rua, através das variáveis de estado.
quando efetuamos a chamada, o servidor devolverá uma resposta que será armazenada no argumento response do método onResponse da chamada.
neste momento, atribuímos à variável de estado listaEnderecoState o valor retornado pela função body() do objeto response, que é a lista de endereço devolvida pelo endpoint da ViaCep.
implementar algumas alterações na função “CardEndereco” para que possamos carregar cada item da LazyColumn com os endereços da listaEnderecoState.