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

[Bug] Aluno salvo não aparece na lista

Na versão mais recente do Android Studio 2022 (API 33) o código apresentado no curso não exibe mais os alunos na lista após adicioná-los.

Inspecionando o código eu suspeitei que o motivo era a instanciação do AlunoDAO, pois tanto o ListaAlunosActivity quanto o FormularioAlunoActivity criavam instâncias diferentes do AlunoDAO (ambos faziam "new AlunoDAO()").

Então eu refatorei o código para guardar o AlunoDAO como um membro da classe ListaAlunosActivity, e esse membro é acessado dentro do setOnClickListener do FormularioAlunoActivity, dessa forma ambas as Activities compartilham a mesma instância, e isso resolveu o problema.

As minhas perguntas são:

  • A minha suspeita faz sentido?
  • Algo mudou nas novas APIs do Android para que o código do curso não funcionasse mais?
  • Caso sim, a minha solução é a ideal pra se adaptar a essa nova API?

Além disso, talvez seja interessante deixar uma observação no curso para esse tipo de problema.

Segue o meu código (os nomes estão em inglês mas de resto é análogo ao código do Alex):

ListaAlunosActivity

public class StudentsListActivity extends AppCompatActivity {
    public static final AlunoDAO alunoDAO = new AlunoDAO();

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

        setTitle("Students list");

        FloatingActionButton fabNewStudent = findViewById(R.id.activity_main_fab_new_student);
        fabNewStudent.setOnClickListener(view -> {
            startActivity(new Intent(StudentsListActivity.this, StudentFormsActivity.class));
        });
    }

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

        ListView studentsListView = findViewById(R.id.activity_students_list_view);
        studentsListView.setAdapter(new ArrayAdapter<>((Context) this,
                android.R.layout.simple_list_item_1,
                alunoDAO.getAlunos()));
    }
}

FormularioAlunoActivity

public class StudentFormsActivity extends AppCompatActivity {

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

        final EditText nameField = findViewById(R.id.activity_student_forms_name);
        final EditText phoneField = findViewById(R.id.activity_student_forms_phone);
        final EditText emailField = findViewById(R.id.activity_student_forms_email);

        Button saveButton = findViewById(R.id.activity_student_forms_save_button);
        saveButton.setOnClickListener(view -> {
            Aluno aluno = new Aluno(nameField.getText().toString(), phoneField.getText().toString(), emailField.getText().toString());

            StudentsListActivity.alunoDAO.save(aluno);

            finish();
        });
    }
}
3 respostas
solução!

Fala Vinicius, de boa ?

Cara se seu aluno dao estiver assim:

public class AlunoDAO {

    private final static List<Aluno> alunos = new ArrayList<>();

    public void salva(Aluno aluno) {
        alunos.add(aluno);
    }

    public List<Aluno> todos() {
        return new ArrayList<>(alunos);
    }
}

Não deveria ter problema algum, como a instância acessa um atributo estático da classe, não deveria ter impacto.

Fala Matheus...

Cara, o problema era justamente esse, eu não tinha me tocado que a lista de alunos havia sido declarada como static, eu declarei como um membro normal da classe...

Mas pensando do ponto de vista arquitetural, faz sentido que essa lista seja estática? Eu (com uma visão de leigo em arquitetura) imagino que haveriam mais de uma instância desse DAO e que cada instância deveria ter a sua lista... Existe algum motivo porque foi declarado desse jeito? A minha solução (do post original) é ruim de alguma forma?

Valeu pela ajuda!

Fala Vinicius,

Cara no dia a dia tu vai pegar a lista de uma api ou de um banco de dados, que geralmente serão atualizados de maneira automática por algum framework... se tu seguir o curso vai ver o live data e room, que tu vai ver esse problema sendo resolvido :)