Atualmente o nosso app é capaz tanto de listar como também cadastrar alunos, porém se a gente adicionou o aluno com alguma informação que a gente não espera ou se, de repente, a gente quer adicionar informações a esse aluno, atualmente a gente não tem essa capacidade, dado que o nosso aplicativo não permite editar os nossos alunos, portanto agora para possibilitar mais opções para o nosso usuário, a gente vai começar a implementar essa feature de uma tal maneira que vai facilitar a edição dessas informações quando for necessário, está bom? Então vamos lá. Considerando aí as abordagens que a gente já conheceu no curso anterior de android o que é que a gente pode estar fazendo para poder começar a implementar esse tipo de funcionalidade, para isso a gente precisa ali começar com uma ação, certo? Como, por exemplo, para cadastrar a gente clica aqui no nosso floating action button e ele abre o formulário para gente colocar o novo aluno, bacana. Só que agora a gente precisa editar, então a gente tem que ter uma ação exatamente no momento que a gente quer editar ali um aluno no próprio aluno, então aqui, nessa caixinha aqui do aluno, certo, a gente também precisar adicionar agora um listener de clique, que aí dessa maneira a gente vai ter a capacidade de adicionar um comportamento novo que vai permitir a edição. Então vamos trabalhar primeiro com o listening e vamos ver o que acontece para poder implementar aqui esse listener, está bom. Então vamos lá, como a gente já viu, para adicionar o listening a gente precisar setar esse listening a partir do setOnClickListener. Então vamos voltar lá na nossa activity, crtl n para entrar numa classe, lista alunos activity, e agora aqui dentro dela a gente precisa achar, por exemplo, o método no qual ele busca ali a referência ali da nossa ListView para que então a gente set o listener, para isso a gente já sabe que a gente está ali no nosso onResume e dentro do onResume a gente tem o configura lista, aí aqui dentro do configura lista a gente pega a referência dele que a gente chamamos aqui de lista de alunos. Então depois que a gente seta o adapter agora a gente vai setar o nosso listener, para isso a gente chama aqui a referência lista de alunos.setOnClickListener. A gente já sabe que a gente vai implementar aqui via classe anônima com o nosso View.OnClickListener, bacana. E aqui a gente tem o nosso OnClick que representa ali a ação que vai ser executada quando o clique acontecer, para a gente ver se realmente está funcionando, certo, a gente pode estar colocando aqui um Toast como a gente fez ali anteriormente no nosso floating action button. Então aqui eu coloco um Toast, a gente vai usar aquele templete que ele já oferece para a gente, ele já completa o que ele consegue completar, aí na parte aqui da String vai sair a mensagem, a gente pode colocar alguma coisa diferente para identificar que é o click do nosso ListView. Então click do ListView, beleza? Bacana. Aí eu só vou estender um pouquinho o código para ficar mais fácil de ver, dá uns enters aqui nesses argumentos para ficar também fácil de ver o código numa única view aqui sem ter que ficar fazendo o init. E agora que a gente fez essa implementação a gente pode testar o nosso aplicativo para ver o que acontece, está bom. Para isso o que é que a gente vai fazer? A gente vai executar aqui, vou escolher o emulador que já está de pé e quando ele terminar aqui a gente vai ver o que vai acontecer, está bom? Nesse primeiro momento eu quero aguardar até o final para mostrar uma coisa nova para vocês. Então vamos lá, a gente está aguardando, ele executou, ele tentou abrir e percebe que ele vai tentar abrir, mas não consegue, esse é realmente o comportamento novo que eu quero mostrar para vocês, está bom? Eu vou executar de novo e vocês vão ver acontecendo. Então executando aqui de novo, vamos ver o que acontece, ele vai tentar executar tudo bonitinho e ele vai abrir ali o aplicativo e ele vai sair, tudo bem. O que é que significa isso? Veja que ele até apareceu essa mensagem nova falando que o agenda, que é o nosso aplicativo, ele está se mantendo de uma maneira que ele está sempre ali parando, tudo bem, e ele está falando: “Olha, você quer fechar essa aplicativo?”, sim, a gente quer fechar nesse momento e agora a gente vai começar a entender o que isso significa. Bom, cada vez que a gente está executando aqui o nosso aplicativo a gente sabe que no momento que ele tudo funciona realmente ele vai aparecer ali a tela, a gente vai ter as interações esperadas, porém vai existir situações nas quais algum comportamento que a gente quer que funcione ele não vai funcionar e nessa situação que ele não vai funcionar ele vai lançar aquelas famosas exceções do Java fazendo com que o nosso aplicativo quebre, que foi exatamente o que aconteceu aqui, tudo bem. Então quando o nosso aplicativo ele quebra ele vai tentar executar e ele vai lá e fecha automaticamente, é dessa maneira que o android acaba funcionando aqui como sistema operacional para controlar aqui os aplicativos. Então se tiver uma exceção ele vai lá e vai quebrar o aplicativo. Vai ser muito comum também você escutar que nesse tipo de situação vai ser chamado de crash do aplicativo ou crash do app, então toda vez que você escutar: “O aplicativo ele crashou” ou algo do gênero é justamente essa ideia de que o aplicativo quebrou, teve algum problema que não foi tratado muito bem ou então o código mal escrito entre outras possibilidades, está bom. Mas agora vem a questão: como que a gente pode identificar o problema que aconteceu, certo? Dada as abordagens que a gente viu nesse momento, para isso o Android Studio ele também tem uma ferramenta de análise de log que vai permitir com que a gente veja todo o log durante a execução do nosso aplicativo, para acessar esse log, certo, a gente vem aqui nessa parte de baixo do Android Studio e aqui nessas abinhas que tem aqui terminal, a gente tem aqui o build e temos esse aqui logcat, entre essas outras possibilidades, dentre elas a gente tem esse logcat que é justamente esse carinha que vai ficar responsável em analisar todo o logo do nosso dispositivo, está bom? Então se a gente vê aqui algumas das opções a gente percebe que logo aqui no começo ele está selecionando qual que é o dispositivo que ele está ali investigando o log, se de repente você tivesse mais de um dispositivo de pé, seja outro emulador ou seja um dispositivo físico, ele também abriria essa possibilidade e mostraria de qual o dispositivo que ele está fazendo log. Então é muito importante você primeiro olhar qual que é o dispositivo para ver se é realmente o que você espera, porque se de repente você quiser encontrar um log e o dispositivo que você está executando, mas aqui está marcando um outro dispositivo que está em tempo ocioso você não vai conseguir investigar isso, está bom. Então fique bem atento nessa primeira opção. Bacana. Logo em seguida ele fala exatamente qual que é o pacote do aplicativo que ele está analisando, percebe que ele tentou analisar ali do nosso aplicativo e ele está falando com essa mensagem de dead, que ele está morto porque realmente esse foi fechado. E aí ele não está fazendo só essa análise, ele está pegando também de outros pacotes aqui também que aí vai de outros aplicativos, serviços disponíveis aqui no nosso celular. Aí beleza, bacana, a gente tem todos esses logs e realmente fica muito difícil de analisar, certo, dado que esses logs aqui podem ser de qualquer outra coisa que não tem relação com o nosso aplicativo, aí para isso, para a gente facilitar essa busca a primeira coisa que eu vou sugerir para vocês é o seguinte: é logo aqui nessa última opção a direita que está indicando “no filters” é você clicar nela e mostrar... e, aliás, selecionar a opção show only selected application, o que é que isso significa? Que ele vai mostrar apenas o log da nossa aplicação, está bom? Que aí dessa maneira a gente vai ter uma capacidade muito mais poderosa de analisar aqui o nosso log porque vai mostrar apenas o que aconteceu do nosso aplicativo em relação ao que a gente implementou, está bom? Então eu vou clicar nessa primeira opção e olha só ele já filtra bastante aqui esses logs e agora só mostra logs que estão relacionados ao nosso pacote, está vendo? BR com Alura agenda. Então é dessa maneira que a gente facilita a busca aqui de log que se acaso acontecer algum problema, isso a gente vê, como eu havia comentado, a gente tem aqui uma exception, a gente tem uma RuntimeException nesse caso e ele está falando que foi exatamente ali no resumo da nossa activity, no momento em que tentou ali configurar a nossa lista. Se a gente vir um pouquinho mais à direita a gente sabe que a gente tem a descrição aqui da nossa exception e aqui ele está falando o seguinte, ele está falando exatamente aqui a mensagem que essa RuntimeException passou, que ele está falando: olha, não chame o setOnClickListener para um AdapterView. Então a gente fez isso e foi exatamente isso que desencadeou ali aquela expection. E além disso ele está falando: olha, muito provavelmente aí você está querendo fazer a configuração do setOnItemClickListener ao invés de você usar ali o seu OnItemClickListener. O que é que isso significa, pessoal? Significa que cada vez que a gente quiser aplicar um tipo de listener para um AdapterView a gente não vai conseguir usar o setOnClickListener, a implementação de setOnClickListener é por padrão lançar essa exception e aí sugerir a implementação desse setOnClickListener. Porque é que isso acontece? Porque quando a gente faz ali o set de click listener para um ListView muito provavelmente a gente não quer que o componente inteiro ListView ele tenha o listenter, a gente quer que seus elementos, seus itens tenham o listener que é o que a gente quer realmente para os nossos alunos, clicar em cada um deles. Então por isso que já foi implementado essa ideia de que se a gente vai colocar um listener por ListView faz ali o crash da aplicação e já indica: olha, você não usar isso e use, sim, esse outro carinha aqui que vai perceber o listener para cada um dos elementos. Então ao invés de a gente usar ali o nosso OnClick aqui que é o nosso OnClickListener a gente vai usar esse outro método aqui, está bom. Então vamos lá, para isso eu vou copiar aqui já para facilitar a nossa vida, eu vou remover esse código aqui, deixa eu só estender aqui, ctrl shift F12, e agora eu vou implementar esse outro método aqui, está bom. Aí veja que ele já tem esse outro método, repare também que esse método é exclusivo aqui de AdapterViews está bom, então se de repente você tentar fazer isso em uma outra view talvez não exista ele, então é um fato bem importante. E agora aqui dentro a gente vai implementar uma outra interface para a gente ver aqui, a gente pode tentar autocompletar e ele mostra que agora ele vai implementar uma interface do AdapterView e não da view, que é o AdapterView.OnItemClickListener. Vamos dar um enter aqui e vamos ver o que acontece. Aí percebe agora é um outro método totalmente diferente do OnClick, certo? Porque o OnClick ele aparecia apenas a view, a gente pode ver aqui diretamente quando a gente tem a implementação do setOnClickListener do floating action button e agora a gente tem esses quatro argumentos, certo? A gente tem bastante argumento aí que a gente pode estar tentando trabalhar, bacana. E vamos agora tentar entender esses argumentos. Como a gente pode ver esse primeiro argumento ele refere-se justamente ao AdapterView que nesse caso é nossa ListView, esse outro elemento ele representa a view que foi clicada, então, por exemplo, se eu clicar aqui no Alex, que é aquele que está aparecendo, ele não vai fazer isso agora porque ele quebrou, mas se eu clicasse nele ele representaria por meio dessa view. E aqui esses dois que está como I e L ainda não tem muito significado para a gente. E agora eu vou tentar traduzir aqui para vocês e a gente já vai colocar um nome que faça sentido. Nesse terceiro argumento a gente tem a posição do elemento, tudo bem? Então, por exemplo, quando a gente teve aí o Alex muito provavelmente ele tem a posição zero, dado que o índice aqui em programação costuma ser zero, e aqui no final a gente tem uma informação que representa o ID, está bom? Em AdapterViews quando a gente acaba utilizando ali os adapters muito internamente tem a capacidade de trabalhar também com IDs. Nesse momento a gente não vai falar muito a respeito, mas entenda que tem essa possibilidade e é por isso que ele vem também aqui na ação de clique do item, está bom? Bacana, então a gente tem essas informações, mas agora, dado que a gente tem essas informações, o que é que a gente pode estar utilizando delas para poder ali começar com o que a gente espera que é pegar um aluno e poder editar. Se a gente perceber bem a gente sabe que a posição é um grande candidato para que a gente consiga recuperar esse aluno, dado que a gente tem uma lista de alunos aqui disponível, certo? Então vamos fazer o seguinte, dado que a gente quer explorar essa parte da posição, ver se realmente funciona como o esperado, vamos agora imprimir essa mensagem aqui com a posição do aluno e vamos ver se realmente ele vai ali obedecer conforme o que é esperado. Então, por exemplo, é um aluno que está na primeira posição vai aparecer a posição zero, é um aluno que está segunda posição vai aparecer a posição um, vamos ver como é que isso funciona. Aí a gente para poder colocar isso a gente colocaria ali um Toast, certo? Só que agora eu vou mostrar uma abordagem um pouquinho diferente agora que a gente aprendeu sobre aqui o nosso logcat, tudo bem? Eu vou ensinar para vocês como que a gente pode estar colocando aqui logs diretamente aqui no logcat para a gente conseguir fazer esses testes, está bom, que aí dessa maneira se caso você precisar debugar o seu aplicativo ou então você quer colocar uma mensagem de feedback, mas que não fique visual assim como é o Toast você pode estar usando essa ferramenta, está bom? E aí para a gente colocar esse log, pessoa, a gente tem um templetezinho também, então deixa eu estender aqui o código, que é esse templete aqui: log, está vendo? Log. Então quando a gente coloca esse log aqui, log e i no final ele já fala que ele já vai colocar esse templete que é da classe log.i, então se a gente colocar aqui, olha só, log i e aí ele já tenta autocompletar aqui para a gente. Essa tag aqui ele vai indicar o seguinte, vai ser uma chave na qual a gente vai conseguir identificar esse nosso log ali dentro do logcat, porque como a gente viu é um log muito grande e as vezes fica difícil de a gente identificar, tem que ficar fazendo ação e assim por diante, aí se a gente coloca aqui essa tag a gente tem a capacidade até mesmo de filtrar por meio desse filtro aqui que temos aqui em cima, está bom? Então é por isso que temos essa tag aqui. Então nessa tag a gente pode implementar aqui uma constante que tenha essa tag ou então a gente pode colocar até mesmo uma string, por exemplo, a posição do aluno, a gente pode colocar posição aluno por exemplo, aí aqui do lado a gente pode colocar realmente o valor que a gente espera para esse log, então para esse log a gente quer pegar exatamente a posição concatenada, então eu vou concatenar a posição aqui. Então é dessa maneira que a gente acaba colocando aqui uma mensagem de via log que vai ser acessível aqui no nosso logcat. Então agora que a gente colocou o listener no item e também a gente colocou um log vamos executar o nosso aplicativo e vamos ver o que acontece, está bom? Então shift F10 para executar o nosso aplicativo, eu vou deixar o logcat aberto para a gente ver o que é que vai acontecendo aqui durante essa execução, está bom. Então eu vou até deixar ele aberto aqui bem grandão e percebe que ele vai mostrando aqui vários logs, aparentemente ele não quebrou, então não quebrou mesmo o nosso aplicativo e aqui ele apareceu tudo bonitinho para a gente. Então agora o que é que eu vou fazer, eu vou cadastrar um aluno da maneira como a gente estava acostumado, então eu vou colocar o Alex aqui, eu vou salvar e beleza, a gente tem nosso Alex. Agora a gente quer testar aquele novo comportamento, certo, que é o nosso novo listener, então eu vou clicar aqui e vamos ver o que acontece. Olha só que bacana, ele está aparecendo aqui, eu vou clicar várias vezes e olha só: ele aparece aqui o Alex, está bom. Então percebe que agora a gente tem uma outra maneira de pegar um feedback aqui por meio do Android Studio quando a gente está desenvolvendo, porque o Toast por mais que ele funcione, ele já fica ali no emulador, a gente não precisa nem usar o Android Studio, ele tem também um probleminha que é justamente a gente ter que ficar ali vendo a parte visual, de repente a gente clica, ele passa o tempo, a gente não consegue ver da maneira esperada. Com o log a gente tem a capacidade de fazer os cliques, saber quantos cliques aconteceram, isso é uma informação importante também e essa informação ela não se perde. Então a gente vai conseguir testar, a gente vai conseguir fazer o mapeamento, a gente vai ter maior poder em relação a essa parte de log, em relação ao feedback da nossa implementação, está bom? Bacana. Vamos só cadastrar agora mais um aluno para ver se realmente ele funciona como o esperado, então eu vou colocar aqui a Fran por exemplo e vamos só ver se nessa parte, a posição, então aqui no Alex é posição zero e na Fran a posição um, a gente consegue ter o que a gente espera, sim, a gente consegue. Então agora sim a gente conseguiu dar o primeiro passo e também a gente aprendeu a usar aqui o nosso logcat. Aí só para poder fechar essa parte do logcat e aí logo em seguida a gente avançar nessa parte da edição do nosso aluno, um outro fator bem importante é que a gente tem aqui os tipos de logs, então ali quando a gente fez esse log.i o que a gente implementou foi esse de info, então se a gente só colocar esse de info não vai aparecer nenhum outro tipo de log a não ser o de info, também da mesma maneira se fosse esse também a gente teria só informações. A gente percebe também que para poder identificar tem esse w/, também no caso do i a gente vai ter o i/, então é dessa maneira que a gente acaba trabalhando aqui com os logs, de repente você quer colocar um log que realmente ele vai acontecer por causa de um erro, aí você vai lá, coloca o log e filtra aqui por erro, então, por exemplo, se eu colocasse aqui um e ele mostraria ali e seria um erro. Eu vou só executar por questões de teste mesmo, inclusive para poder testar posteriormente o que é que eu vou fazer para a gente não ter que ficar cadastrando na mão. Logo no começo do onCreate mesmo eu vou pegar aqui a nossa referência e vou salvar dois alunos, que aí dessa maneira a gente consegue ficar testando sem ter que ficar colocando no formulário. Então eu vou deixar Alex, aqui as informações de telefone eu vou deixar aqueles padrões que eu estou acostumado a deixar, e aí dessa maneira facilita o nosso teste ao invés de a gente ficar ali colocando manualmente via formulário. Então eu fiz o primeiro aluno, agora eu vou fazer o segundo aluno, que vai ser aluna, vai ser a Fran. Então eu vou deixar o mesmo telefone e a coisa que eu vou mudar é o e-mail, o e-mail eu vou deixar [email protected], está bom? Então esses são dos dois alunos que eu vou usar como exemplo porquê dessa maneira a gente vai facilitar aqui o nosso teste. Então agora eu coloquei um log de erro para a gente ver o que acontece, para ver se realmente ele filtra aqui para a gente, e assim que ele executar aqui o nosso aplicativo a gente vai fazer esse teste. Vamos ver se ele coloca os alunos para a gente, já colocou os alunos, dado que a gente está usando, agora eu cliquei e ele já mostra aqui o Diego. Agora eu vou deixá-lo que ele vai mostrar todas as possibilidades e agora sim a gente vê que a gente tem os nossos logs aqui, cada vez que a gente clica aqui no nosso aluno ele já faz ali o log bonitinho para a gente. Aí só para poder estar reforçando: se você não vai ser um erro, deixa o i mesmo que é o log de info que é o que é esperado, está bom? Sempre entenda, que cada vez que você usar esses logs você tem que usar consciente, então no geral vai ser o de info, mas aí se tiver alguma outra ação em relação a essas outras possibilidades, aí você pode estar usando sem nenhum problema. Bacana, a gente aprendeu sobre log, a gente aprendeu sobre o listener para cada um dos elementos do AdapterView, a seguir a gente vai trabalhar em cima desse carinha aqui, desse nosso novo listener para possibilitar a edição. Então até já.