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

problema na edição dos elementos da lista

Sempre que entro no formulario para criar um novo aluno, ele me retorna o ID daquele objeto Aluno como 1 e nao incrementa o ID corretamente, a inserção do objeto na lista funciona corretamente mas quando é para editar, que usa a comparação do ID para alterar na lista ele coloca os dados do elemento selecionado no primeiro e nao edita o selecionado.

foto de ajuda

No exemplo criei 3 elementos na lista e todos eles tinham ID 1 o contador do DAO estava com valor 1 e apenas a posição do adapter estava correto, desta forma a remoção também funciona corretamente, como se toda vez que eu entro na Activity do formulário ele cria um novo objeto DAO que recebe valor 1 no contador. Ja tentei alterar algumas coisas que imaginei ser a causa porém sem sucesso.

6 respostas

Fala Bruno! De boa ?

Cara consegue mandar o código do Dao e do Formulário pra gente dar uma olhadinha ?

Sim, claro.

public class AlunoDAO {

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

public int contadorDeIDs = 1;

public void salvar(@NonNull Aluno aluno) {
    aluno.setId(contadorDeIDs);
    alunos.add(aluno);
    incrementaID();
}

private void incrementaID() {
    contadorDeIDs++;
}

public void edita(Aluno aluno){
    Aluno alunoEncontrado = buscaAlunoPeloID(aluno);
    if(alunoEncontrado != null){
        int posicaoDoAluno = alunos.indexOf(alunoEncontrado);
        alunos.set(posicaoDoAluno,aluno);
    }
}

@Nullable
private Aluno buscaAlunoPeloID(Aluno aluno) {
    for (Aluno a : alunos) {
        if (a.getId() == aluno.getId()) {
            return a;
        }
    }
    return null;
}

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

public void remover(Aluno aluno) {
    Aluno alunoDevolvido = buscaAlunoPeloID(aluno);
    if(alunoDevolvido != null){
        alunos.remove(alunoDevolvido);
    }
}

}

public class FormularioAlunoActivity extends AppCompatActivity {

private static final String TITULO_APPBAR_NOVO_ALUNO = "Novo Aluno";
private static final String TITULO_APPBAR_EDITA_ALUNO = "Editar Aluno";
private EditText campoNome;
private EditText campoTelefone;
private EditText campoEmail;
private Aluno aluno;
final AlunoDAO dao = new AlunoDAO();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_formulario_aluno);
    inicializacaoDosCampos();
    configuraBotaoSalvar();
    carregaAluno();
}

private void carregaAluno() {
    Intent dados = getIntent();
    if (dados.hasExtra(CHAVE_ALUNO)){
        setTitle(TITULO_APPBAR_EDITA_ALUNO);
        aluno = (Aluno) dados.getSerializableExtra(CHAVE_ALUNO);
        preencheCampos();
    }else{
        setTitle(TITULO_APPBAR_NOVO_ALUNO);
        aluno = new Aluno();
    }
}

private void preencheCampos() {
    campoNome.setText(aluno.getNome());
    campoTelefone.setText(aluno.getTelefone());
    campoEmail.setText(aluno.getEmail());
}

private void configuraBotaoSalvar() {
    Button botaosalvar = findViewById(R.id.activity_formulario_aluno_botao_salvar);
    botaosalvar.setOnClickListener(view -> finalizaFormulario());
}

private void finalizaFormulario() {
    preencheAluno();
    if(aluno.temIdValido()){
        dao.edita(aluno);
    }else{
        dao.salvar(aluno);
    }
    finish();
}

private void inicializacaoDosCampos() {
    campoNome = findViewById(R.id.activity_formulario_aluno_nome);
    campoTelefone = findViewById(R.id.activity_formulario_aluno_telefone);
    campoEmail = findViewById(R.id.activity_formulario_aluno_email);
}

private void preencheAluno() {
    String nome = campoNome.getText().toString();
    String telefone = campoTelefone.getText().toString();
    String email = campoEmail.getText().toString();

    aluno.setNome(nome);
    aluno.setEmail(email);
    aluno.setTelefone(telefone);

}

}

Aqui também o código da ListaDeAlunos caso ajude.

public class ListaAlunoActivity extends AppCompatActivity {

final AlunoDAO dao = new AlunoDAO();
public static final String TITULO_APPBAR = "Lista de alunos";
private ArrayAdapter<Aluno> adapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lista_alunos);
    setTitle(TITULO_APPBAR);
    configuraFabNovoAluno();
    configuraLista();
    /*
    dao.salvar(new Aluno("Bruno","123123","bruno@teste.com"));
     dao.salvar(new Aluno("Jebises","123123123","jefrio@teste.com"));
    */
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add("Remover");
}

private void configuraFabNovoAluno() {
    FloatingActionButton botaoNovoAluno = findViewById(R.id.activity_botao_novo_aluno);
    botaoNovoAluno.setOnClickListener(view ->
            abreFormularioModoInsereAluno()
    );
}

private void abreFormularioModoInsereAluno() {
    startActivity(new Intent(this, FormularioAlunoActivity.class));
}

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

private void atualizarAlunos() {
    adapter.clear();
    adapter.addAll(dao.todos());
}

private void configuraLista() {
    ListView listaDeAlunos = findViewById(R.id.activity_lista_alunos_listview);
    configuraAdapter(listaDeAlunos);
    configuraListenerDeCliquePorItem(listaDeAlunos);
    configuraListenerDeCliqueLongoPorItem(listaDeAlunos);
    registerForContextMenu(listaDeAlunos);
}

private void configuraListenerDeCliqueLongoPorItem(@NonNull ListView listaDeAlunos) {
    listaDeAlunos.setOnItemLongClickListener((adapterView, view, posicao, id) -> {
        Aluno alunoEscolhido = (Aluno) adapterView.getItemAtPosition(posicao);
        //removeAlunoLista(alunoEscolhido);
        Log.i("OBS", alunoEscolhido.getId() + " " + dao.contadorDeIDs + " " + posicao);
        return false;
    });
}

private void removeAlunoLista(Aluno aluno) {
    dao.remover(aluno);
    adapter.remove(aluno);
}

private void configuraListenerDeCliquePorItem(@NonNull ListView listaDeAlunos) {
    listaDeAlunos.setOnItemClickListener((adapterView, view, posicao, id) -> {
        Aluno alunoEscolhido = (Aluno) adapterView.getItemAtPosition(posicao);
        abreFormularioModoEditaAluno(alunoEscolhido);
    });
}

private void abreFormularioModoEditaAluno(Aluno aluno) {
    Intent vaiParaFormularioActivity = new Intent(ListaAlunoActivity.this,
            FormularioAlunoActivity.class);
    vaiParaFormularioActivity.putExtra(CHAVE_ALUNO, aluno);
    startActivity(vaiParaFormularioActivity);
}

private void configuraAdapter(@NonNull ListView listaDeAlunos) {
    adapter = new ArrayAdapter<>(
            this, android.R.layout.simple_list_item_1);
    listaDeAlunos.setAdapter(adapter);
}

}

solução!

Voce precisa colocar o contador de ids para ser estático, usando o static, ai deve funcionar o seu problema.

Show! testei aqui e funcionou, muito obrigado, entendi o porque precisa ser estatico, agora não esqueço mais dessa kk. Obrigado !!