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

Uso do Dialog - NEP

Olá, pessoal.

Em um outro app que estou criando, precisava exatamente de um dialog como no projeto da aula. Aproveitando-o, ele funcionou para inserir um novo (salvar), mas está dando NEP para editar. Não estou entendendo o motivo.

 Process: com.example.cadastrodevisita, PID: 31436
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.cadastrodevisita.adapter.EmailEquipeAdapter$OnItemClickListener.onItemClick(int, com.example.cadastrodevisita.model.EmailEquipe)' on a null object reference
        at com.example.cadastrodevisita.adapter.EmailEquipeAdapter$1.onClick(EmailEquipeAdapter.java:77)
public class EmailEquipeAdapter extends BaseAdapter {

    private List<EmailEquipe> emailEquipes = new ArrayList<>();
    private final Context context;
    private final OnItemClickListener onItemClickListener;
    private int posicao;
    private EmailEquipe emailEquipe;

    public EmailEquipeAdapter(Context context, OnItemClickListener onItemClickListener) {
        this.context = context;
        this.onItemClickListener = onItemClickListener;
    }

    public EmailEquipeAdapter(Context context, List<EmailEquipe> emailEquipes) {
        this.emailEquipes = emailEquipes;
        this.context = context;
        this.onItemClickListener = null;
    }

    @Override
    public int getCount() {
        return emailEquipes.size();
    }

    @Override
    public EmailEquipe getItem(int posicao) {
        return emailEquipes.get(posicao);
    }

    @Override
    public long getItemId(int posicao) {
        return emailEquipes.get(posicao).getId();
    }

    @Override
    public View getView(int posicao, View view, ViewGroup viewGroup) {
        View viewCriada = criaView(viewGroup);
        EmailEquipe emailDevolvido = emailEquipes.get(posicao);
        this.posicao = posicao;
        vincula(viewCriada, emailDevolvido);
        return viewCriada;
    }

    private void vincula(View view, EmailEquipe emailEquipe) {
        TextView email = view.findViewById(R.id.item_email_nome);
        email.setText(emailEquipe.getEmail());
        TextView unidade = view.findViewById(R.id.item_unidade);
        unidade.setText(emailEquipe.getUnidade());
        this.emailEquipe = emailEquipe;
        configuraItemClique(view);
    }

    private void configuraItemClique(@NonNull View itemView) {
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener
                        .onItemClick(posicao, emailEquipe);            //NEP BEM AQUI
            }
        });
    }

    private View criaView(ViewGroup viewGroup) {
        return LayoutInflater
                .from(context)
                .inflate(R.layout.item_email_equipe, viewGroup, false);
    }

    public void atualiza(List<EmailEquipe> emailEquipes) {
        this.emailEquipes.clear();
        this.emailEquipes.addAll(emailEquipes);
        notifyDataSetChanged();
    }

    public void remove(EmailEquipe emailEquipe) {
        emailEquipes.remove(emailEquipe);
        notifyDataSetChanged();
    }

    public List<EmailEquipe> getEmailEquipes() {
        return emailEquipes;
    }

    public interface OnItemClickListener {
        void onItemClick(int posicao, EmailEquipe emailEquipe);
    }

}

Alguém conseguiria me auxiliar, por favor?

7 respostas

Vi que você tem 2 construtores.

Um deles não recebeu o listener e disso tu passou null.

Provavelmente nesse cenário tu tem levado npe

É porque utilizo um construtor que não recebe o Listener. Como estava dando erro sem atribuir nada ou não o colocando dentro do construtor, coloquei como null. Como devo proceder, por favor?

Fala, Matheus. Tudo bom?

Rapaz, consegui resolver o NPE, mas quando abre o dialog para edição e salvo as alterações, o adapter não está atualizando com as modificações, sendo que no onResume peço para buscá-las. Poderia me ajudar, por favor?

Observação: quando peço apenas para "aplicar as mudanças e reiniciar a activity" no Android Studio, sem reinicializar todo o app, o adapter atualiza.

Código do onResume:

@Override
    protected void onResume() {
        super.onResume();
        adapter.atualiza(emailEquipeDAO.todos());
    }

Código configura lista:

    private void configuraLista() {
        listaEmails = findViewById(R.id.listview_emailEquipe);

        adapter = new EmailEquipeAdapter(this, new EmailEquipeAdapter.OnItemClickListener(){
            @Override
            public void onItemClick(int posicao, EmailEquipe emailEquipe) {
                Cadastro_Emails_Equipe.this.abreFormularioEditaProduto(posicao, emailEquipe);
            }
        });
        listaEmails.setAdapter(adapter);
    }

Código atualiza do adapter:

    public void atualiza(List<EmailEquipe> emailEquipes) {
        this.emailEquipes.clear();
        this.emailEquipes.addAll(emailEquipes);
        notifyDataSetChanged();
    }

Código edita que já passa a posição, abre com os dados certinho:

    private void edita(int posicao, EmailEquipe emailEquipe){
        emailEquipeDAO.edita(posicao, emailEquipe);
    }

Código "edita" e "lista todos" do adapter:

public void edita(int posicao, EmailEquipe emailEquipe) {
        emails.set(posicao, emailEquipe);
    }

public List<EmailEquipe> todos() {
        return new ArrayList<>(emails);
    }

Bom dia, Matheus.

Percebi que virando a tela (da mesma forma quando saio e volto para a activity), o adapter só atualiza assim. Mesmo com o onResume e agora coloquei o método atualiza (antes passava o arraylist como parâmetro) pegando a lista "todos" do DAO, que está como "static", e mesmo assim não atualiza "sozinho":

public class EmailEquipeDAO {

    private final static ArrayList<EmailEquipe> emails = new ArrayList<>();

    public List<EmailEquipe> todos() {
        return new ArrayList<>(emails);
    }
    public void atualiza2(){
        this.emailEquipes.clear();
        this.emailEquipes.addAll(dao.todos());
        notifyDataSetChanged();
    }

Coisa boba, mas não tô enxergando o erro. Que raiva haha. Poderia me auxiliar, por favor. Vlw, cara

solução!

Oi Thiago, tudo bem? Analisei todo o seu caso e provavelmente o problema é que o onResume() não é chamado novamente quando vc fecha o dialog, seja por clicar fora dele ou clicar no botão confirmar. Em outras palavras, a atualização precisa ser feita quando o botão de salvar do dialog for acionado.

[]s

Tudo ótimo e contigo, Alex? Perfeito! Não vi isso. Pelo costume em usar activities, primeira vez que experimento dialog, não percebi isso. Muitíssimo obrigado e parabéns pelas aulas.

Opa Thiago, estou bem também! Fico muito feliz que conseguiu resolver o seu problema e muito obrigado pelo feedback e reconhecimento! É bastante importante pra gente saber que está aproveitando nosso o conteúdo.

Bons estudos! :)