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

Alterar dados não funciona

Bom noite,

Quando clico em um item da lista, ele passa para a activity do formulario com os dados corretamente, faço a alteração e salvo. Quando retorna para a lista ele adiciona ao invés de alterar. Coloquei um breakpoint na classe FormularioActivity, e método aluno.getId() sempre retorna null.

insira seu código aqui

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 = getIntent(); 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.getAluno();

AlunoDAO dao = new AlunoDAO(this); if (aluno.getId() != null){ dao.altera(aluno); } else{ dao.insere(aluno); } dao.close();

finish(); break; }

return super.onOptionsItemSelected(item); } }

/* Created by Renato on 04/01/2017. */

public class FormularioHelper {

private final EditText campoNome; private final EditText campoEndereco; private final EditText campoTelefone; private final EditText campoSite; private final RatingBar campoNota;

private Aluno aluno;

public FormularioHelper(FormularioActivity activity){ this.aluno = new Aluno(); campoNome = (EditText) activity.findViewById(R.id.formulario_nome); campoEndereco = (EditText) activity.findViewById(R.id.formulario_endereco); campoTelefone = (EditText) activity.findViewById(R.id.formulario_telefone); campoSite = (EditText) activity.findViewById(R.id.formulario_site); campoNota = (RatingBar) activity.findViewById(R.id.formulario_nota); }

public Aluno getAluno() { Aluno aluno = new Aluno(); aluno.setNome(campoNome.getText().toString()); aluno.setEndereco(campoEndereco.getText().toString()); aluno.setTelefone(campoTelefone.getText().toString()); aluno.setSite(campoSite.getText().toString()); aluno.setNota(Double.valueOf(campoNota.getProgress()));

return aluno; }

public void preencheFormulario(Aluno aluno) {

this.aluno = aluno; campoNome.setText(aluno.getNome()); campoEndereco.setText(aluno.getEndereco()); campoTelefone.setText(aluno.getTelefone()); campoSite.setText(aluno.getSite()); campoNota.setProgress(aluno.getNota().intValue()); } }

3 respostas

Bom dia Renato,

O Problema provavelmente está na sua ListaActivity, pode verificar se você está setando o id no objeto aluno antes de passar para o formulário?

Abrass

Bom dia Ayrton,

Então fiquei confuso nessa parte, por que na classe ListaAlunoActivity estou enviando o objeto aluno para o formulário, tanto que recupero o objeto através do método getItemAtPosition. Segue o código para analise.

public class ListaAlunoActivity extends AppCompatActivity {

    private ListView listaAlunos;

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

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

        listaAlunos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> lista, View item, int position, long id) {
                Aluno aluno = (Aluno) listaAlunos.getItemAtPosition(position);

                Intent intentVaiParaFormulario = new Intent(ListaAlunoActivity.this, FormularioActivity.class);
                intentVaiParaFormulario.putExtra("aluno",aluno);

                startActivity(intentVaiParaFormulario);
            }
        });

        /*
        listaAlunos.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(ListaAlunoActivity.this, "CLIQUE LONGO", Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        */
        Button novoAluno = (Button) findViewById(R.id.lista_aluno_novo);
        novoAluno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentVaiProFormulario = new Intent(ListaAlunoActivity.this, FormularioActivity.class);
                startActivity(intentVaiProFormulario);
            }
        });

        registerForContextMenu(listaAlunos );
    }

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

        ArrayAdapter<Aluno> adapter = new ArrayAdapter<Aluno>(this, android.R.layout.simple_list_item_1, alunos);
        listaAlunos.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) listaAlunos.getItemAtPosition(info.position);

                AlunoDAO dao = new AlunoDAO(ListaAlunoActivity.this);
                dao.deleta(aluno);
                dao.close();

                carregaLista();

                return false;
            }
        });
    }
}
solução!

Olá Ayrton,

Achei o problema, está na classe FormularioHelper, eu me esqueci de tirar a nova instância do objeto ( this.aluno = new Aluno() ) aluno do método getAluno(), assim quando FormularioActiviy faz a chamada, o objeto fica sem o Id e acabava inserindo ao invés de alterar. Mas obrigado pela atenção, abraços.