2
respostas

lista telefonesDoAluno está nula na Activity de formulário

Olá!

Estive acompanhando a implementação de todas as tasks sem problemas, até a task de Editar Aluno. Nela, após fazer todas as alterações/implementações necessárias, e ir testar a app, a mesma não atualiza os telefones e, ainda, quebra. O erro é muito fácil de identificar, já que a lista que passamos como parametro telefonesDoAluno não possui instância nenhuma, nem inicialização em parte alguma do FormActivity. Tanto que sua cor de destaque no atributo permanece cinza. Por isso, ao tentar iterar sobre ela quando tentamos executar o Edita, eu obtenho a exception. Tentei procurar no código do instrutor onde ele atribui valores para essa lista, mas não achei... alguém teria alguma ideia para me ajudar? Obrigado desde já!

private EditText campoNome;
    private EditText campoTelefoneFixo;
    private EditText campoTelefoneCelular;
    private EditText campoEmail;
    private AlunoDAO alunoDAO;
    private Aluno aluno;
    private TelefoneDAO telefoneDAO;
    private List<Telefone> telefonesDoAluno;
private void preencheCamposTelefone() {
        new BuscaTodosTelefonesDoAlunoTask(telefoneDAO, aluno, new BuscaTodosTelefonesDoAlunoTask.TelefonesEncontradosListener() {
            @Override
            public void quandoEncontrados(List<Telefone> telefonesDoAluno) {
                for (Telefone telefone :
                        telefonesDoAluno) {
                    if (telefone.getTipo() == TipoTelefone.TELEFONE_FIXO) {
                        campoTelefoneFixo.setText(telefone.getNumero());
                    } else {
                        campoTelefoneCelular.setText(telefone.getNumero());
                    }
                }
            }
        }).execute();
    }
 private void editaAluno(Telefone telefoneFixo, Telefone telefoneCelular) {
        new EditaAlunoTask(alunoDAO, aluno, telefoneFixo, telefoneCelular, telefoneDAO, telefonesDoAluno, this::finish).execute();
    }
public class EditaAlunoTask extends AsyncTask<Void, Void, Void>{
    private final AlunoDAO alunoDAO;
    private final Aluno aluno;
    private final Telefone telefoneFixo;
    private final Telefone telefoneCelular;
    private final TelefoneDAO telefoneDAO;
    private List<Telefone> telefonesDoAluno;
    private final AlunoEditadoListener listener;

    public EditaAlunoTask(AlunoDAO alunoDAO, Aluno aluno, Telefone telefoneFixo, Telefone telefoneCelular, TelefoneDAO telefoneDAO, List<Telefone> telefonesDoAluno, AlunoEditadoListener listener) {
        this.alunoDAO = alunoDAO;
        this.aluno = aluno;
        this.telefoneFixo = telefoneFixo;
        this.telefoneCelular = telefoneCelular;
        this.telefoneDAO = telefoneDAO;
        this.telefonesDoAluno = telefonesDoAluno;
        this.listener = listener;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        alunoDAO.edita(aluno);
        vinculaAlunoComTelefone(aluno.getId(), telefoneFixo, telefoneCelular);
        atualizaIdTelefones(telefoneFixo, telefoneCelular);
        telefoneDAO.atualiza(telefoneFixo, telefoneCelular);
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        listener.quandoEditado();
    }

    public interface AlunoEditadoListener {
        void quandoEditado();
    }

    private void atualizaIdTelefones(Telefone telefoneFixo, Telefone telefoneCelular) {
        for (Telefone telefone :
                telefonesDoAluno) {
            if (telefone.getTipo() == TipoTelefone.TELEFONE_FIXO) {
                telefoneFixo.setId(telefone.getId());
            } else {
                telefoneCelular.setId(telefone.getId());
            }
        }
    }

    private void vinculaAlunoComTelefone(int alunoId, Telefone...telefones) {
        for (Telefone telefone :
                telefones) {
            telefone.setAlunoId(alunoId);
        }
    }
}
2 respostas

att. Utilizando a implementação via lambda, consigo fazer a atribuição this.telefonesDoAluno = telefones, e o código funciona. Mas gostaria de saber como/onde faria essa atribuição se estou optando por não utilizar a expressão lambda...

Obrigado mais uma vez!

Fala Henrique, de boa ?

Mano, acho que é um caso bacana pra tu ver o projeto do instrutor no github e comparar com o que tu fez: https://github.com/alura-cursos/android-room-parte-2/commits/aula-5

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software