5
respostas

Aplicação com os dados duplicados

Boa tarde Pessoal Tudo bem?

Referente a aplicação do curso de android que é uma agenda, quando eu abro a aplicação ele apresenta com 2 linhas com nomes diferentes, porém eu saio da aplicação e entro novamente, a mesma apresenta com as linhas duplicadas, ou seja, se 2 fica 4 linhas e com os mesmos dados. Alguém poderia por favor me dar um Help de como eu resolvo esse problema ? kkkkk.

Obrigado!!1

5 respostas

Olá Cleriston, tudo certinho?

Coloca o teu código aqui para tentarmos te ajudar. Clica no botão inserir código e coloca ele aqui.

Ola Diego,

Segue os códigos abaixo.

package alura.com.br.UI.activity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

import alura.com.br.R;
import alura.com.br.UI.dao.AlunoDAO;
import alura.com.br.model.Aluno;

import static alura.com.br.UI.activity.ContatesActivities.CHAVE_ALUNO;

public class FormularioAlunoActivity extends AppCompatActivity {

    public static final String TITULO_APP_BAR_EDITA_ALUNO = "Edita Aluno";
    public static final String TITULO_APP_BAR_NOVO_ALUNO = "Novo Aluno";
    private EditText campoNome;
    private EditText campoTelefone;
    private EditText campoEmail;
    private final AlunoDAO dao = new AlunoDAO();
    private Aluno aluno;

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

        final AlunoDAO dao = new AlunoDAO();

        // É necessário incluir o Final caso estiver usando a variavel via local.

        inicializacaoDosCampos();

        configuraBotaoSalvar(dao);

        // Para pegar a informação que é mandanda da outra activity ou seja que é devolvida

        Intent dados = getIntent();


        carregaAluno(dados);

    }

    private void carregaAluno(Intent dados) {

        // O hasExtra verificar se tem extra.
        if (dados.hasExtra(CHAVE_ALUNO))
        {

            setTitle(TITULO_APP_BAR_EDITA_ALUNO);
            // Neste caso irá realizar a edição para atualizar os dados e transferir para as outras activity's
            aluno = (Aluno) dados.getSerializableExtra(CHAVE_ALUNO);
            preencheCampos();
        }

        else

        {
            setTitle(TITULO_APP_BAR_NOVO_ALUNO);
            aluno = new Aluno();

        }
    }

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

    private void configuraBotaoSalvar(final AlunoDAO dao) {
        Button botaoSalvar = findViewById(R.id.activity_formulario_aluno_botao_salvar);

        // serve para verificr se aconteceu uma ação
        botaoSalvar.setOnClickListener(new View.OnClickListener() {

            // Todos os componentes que herdam de view
            @Override
            public void onClick(View v) {
                //           preencheAluno alunoCriado = criaAluno();
                //           salva(alunoCriado, dao);

                finalizaFormulario(dao);
            }
        });
    }

    private void finalizaFormulario(AlunoDAO dao) {
        preencheAluno();

        if (aluno.temIdValido())
        {
            dao.edita(aluno);
        }
        else
            {
                dao.salva(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 salva(Aluno aluno, AlunoDAO dao) {
 //       dao.salva(aluno);

        // Possibilidade de iniciar outra activity  e espera um argumento padrão
        // Intent indica a classe de origem pra destino
        //  startActivity(new Intent(FormularioAlunoActivity.this, ListaAlunosActivity.class));

//        finish();
//    }

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

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

        // + esse sinal é para concatenar
        //return new preencheAluno (nome, telefone, email);

    }
}
package alura.com.br.UI.dao;

import java.util.ArrayList;
import java.util.List;

import alura.com.br.model.Aluno;

public class AlunoDAO {

    // Criará uma entidade estatica para salvar os dados.

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

    // Para adicionar novos ID's
    private static int contadorDeIds = 1;

    // Vai salvar o aluno na lista estatica
    public void salva(Aluno aluno) {

        aluno.setId(contadorDeIds);
        alunos.add(aluno);

        // Adicionando + 1 Id
        atualizaIDS();

    }

    private void atualizaIDS() {
        contadorDeIds ++;
    }

    // Ira criar um comportamento para editar
    public void edita(Aluno aluno){

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

    }

    private Aluno buscaAlunoPeloID(Aluno aluno) {
        Aluno alunoEncontrado = null;

        for (Aluno a: alunos )
        {

            if (a.getId() == aluno.getId())
            {
                return a;

            }
        }
        return null;
    }

    //Cópia da lista estatica na qual não ira afetar a aplicação
    public List<Aluno> todos() {
        return new ArrayList<>(alunos);

    }
}
package alura.com.br.UI.activity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.List;

import alura.com.br.R;
import alura.com.br.UI.dao.AlunoDAO;
import alura.com.br.model.Aluno;

import static alura.com.br.UI.activity.ContatesActivities.CHAVE_ALUNO;

// o AppCompatActivity - Irá trazer o App Bar com o titulo do aplicativo
public class ListaAlunosActivity extends AppCompatActivity {

    public static final String TITULO_APP_BAR = "Lista de Alunos";

    private final AlunoDAO dao = new AlunoDAO();

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


        // O setTitle, Muda o titulo que fica no app bar

        setTitle(TITULO_APP_BAR);

        configuraFABNovoAluno();

        dao.salva(new Aluno("Cleriston", "11941529166", "cleriston@gmail.com"));
        dao.salva(new Aluno("Marcelo", "11944512562", "Marcelo@gmail.com"));

    }

    private void configuraFABNovoAluno() {
        FloatingActionButton botaoNovoAluno = findViewById(R.id.activity_lista_alunos_fab_novo_aluno);
        botaoNovoAluno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                abreFormularioModoInsereAluno();
            }
        });
    }

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

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

        // Instancia do DAO

        confirguraLista();
    }

    private void confirguraLista() {
        final ListView ListaDeAlunos = findViewById(R.id.activity_lista_alunos_listview);

        final List<Aluno> alunos = dao.todos();
        ConfiguraAdapter(ListaDeAlunos, alunos);

        // Irá realizar uma ação com o Click
        configiraListenerDeClickProItem(ListaDeAlunos);
    }

    private void configiraListenerDeClickProItem(ListView listaDeAlunos) {
        listaDeAlunos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {

                // Incluindo os logis do LogCat
                // Na parte da TAG indica a onde você deseja encontrar em qual posição esta o elemento do LogCat
                // Log.i("Aluno", "" + position);

                Aluno alunosEscolhido = (Aluno) adapterView.getItemAtPosition(position);
                Intent vaiParaFormularioActivity = new Intent(ListaAlunosActivity.this, FormularioAlunoActivity.class);

                // Extra - Serve para transferir dados para as activity's e atualiza-las
                vaiParaFormularioActivity.putExtra(CHAVE_ALUNO, alunosEscolhido);
                startActivity(vaiParaFormularioActivity);
            }
        });
    }

    private void ConfiguraAdapter(ListView listaDeAlunos, List<Aluno> alunos) {
        listaDeAlunos.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, alunos));
    }
}

package alura.com.br.model;

import androidx.annotation.NonNull;

import java.io.Serializable;


// Serializable - Converte a capacidade dos objetos para bytes --- neste caso funcionou devido o putExtra ter sido Byte -  se for inteiros, strings, não teria esse problema

public class Aluno implements Serializable {

    private int id = 0;
    private String nome;
    private String telefone;
    private String email;

    public Aluno(String nome, String telefone, String email) {
        this.nome = nome;
        this.telefone = telefone;
        this.email = email;
    }

    public Aluno() {

    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getNome() {
        return nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public String getEmail() {
        return email;
    }

    @NonNull
    @Override
    public String toString() {
        return nome;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public boolean temIdValido() {
        return id > 0;
    }
}