Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Alunos não retornam

Na aula 5.3 eu estou tentando fazer com um click aparecer a informação do aluno na tela de formulário, porem abre a tela mas não retorna as informações do aluno na tela, debbuguei o código e percebi que o valor que a intent esta recebendo do .getSerializableExtra("aluno"); esta retornando com um valor nulo, e com isso ele não executa o if. alguem poderia analizar meus códigos para ver onde posso ter errado ? obs.: as 2 classas a ListaAlunos e Formularios vão estão nas duas próximas postagens com a classe ListaAlunos primeiro.

4 respostas
solução!

public class ListaAlunosActivity extends AppCompatActivity {


    private ListView listaAluno;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_alunos);

        listaAluno = (ListView) findViewById(R.id.lista_alunos);

        listaAluno.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> lista, View item, int position, long id) {

                Aluno aluno = (Aluno) listaAluno.getItemAtPosition(position);
                Intent intent = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                intent.putExtra("aluno", aluno);
                startActivity(intent);
            }
        });

        Button novoAluno = (Button) findViewById(R.id.ListaAluno_Novo_Aluno);
        novoAluno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                startActivity(intent);
            }
        });

        registerForContextMenu(listaAluno);
    }

    private void carregaLista() {
        AlunoDAO dao = new AlunoDAO(this);
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();

        listaAluno = (ListView) findViewById(R.id.lista_alunos);
        ArrayAdapter<Aluno> adapter;
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, alunos);
        listaAluno.setAdapter(adapter);
    }

    @Override
    protected void onResume() {
        super.onResume();
        carregaLista();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, final ContextMenu.ContextMenuInfo menuInfo) {
        MenuItem deletar = menu.add("Deletar");
        deletar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
                Aluno aluno = (Aluno) listaAluno.getItemAtPosition(info.position);

                AlunoDAO dao = new AlunoDAO(ListaAlunosActivity.this);
                dao.deleta(aluno);
                dao.close();
                carregaLista();
                Toast.makeText(ListaAlunosActivity.this,"Deletar o aluno " + aluno.getNome(), Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }

}

public class FormularioActivity extends AppCompatActivity {

    private FormularioHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario);

        helper = new FormularioHelper(this);

        Intent intent = new Intent();
        Aluno aluno = (Aluno) intent.getSerializableExtra("aluno");

        if(aluno != null){
            helper.preencheFormulario(aluno);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_formulario, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_formulario_ok:
                Aluno aluno = helper.pegaAluno();
                AlunoDAO dao = new AlunoDAO(this);
                dao.insere(aluno);
                dao.close();
                Toast.makeText(FormularioActivity.this, "Aluno "+aluno.getNome()+" salvo com sucesso !!", Toast.LENGTH_SHORT).show();
                finish();
                break;
        }

        return super.onOptionsItemSelected(item);
    }
}

Oi Fabricio, tudo bem ?

Dei uma olhadinha no seu código. Você está tentando popular seus campos com o aluno que veio na intent, contudo, ao chegar no seu formulario activity, no oncreate, você está criando uma nova intent, que ainda não possui nada, por isso ao tentar pegar getSerializableExtra, o aluno não existe, é nulo. O que estamos querendo é pegar a intent que nossa ListaAlunosActivity está no mandando, para isso invés de instanciar uma intent, vamos pegar a que está chegando, atráves do metódo :

Intent intent = getIntent() ;

Dessa forma estamos pedindo ao android que ele nos devolva a intent que chegou.

Tenta fazer essa modificação no seu código e fala para gente se deu tudo certo.

Espero ter ajudado !

Abraços :)

Matheus

Olá, deu tudo certo Matheus, muito obrigado pela dica, eu estava quebrando a cabeça descobrir.