Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Ajuda com Remoção do usuario com alerdDialog

Boa noite instrutor, gostaria de uma ajuda. Estou querendo remover de uma lista os usuarios, precionando no item da lista com o metodo onItemLong... e assim aparecer o alertDialog, assim como voce fez agora na terceira parte do curso.

Bom eu estou usando banco de dados SQLite, fiz o metodo qye remove, tudo certo com ele, ele remove, porem nao consigo fazer o alertDialog para remover e nem atualizar a lista depois que remove, pode me ajudar?? segue os codigos:

// Metodo de edição:

    public void deletar(Usuario usuario) {
        try {
            open();
            conexao.delete(DataBase.TABELA_USUARIO,
                    DataBase.ID_USUARIO + "=" + usuario.getIdUsuario(), null);
        } finally {
            close();
        }
    }

Metodo onItemLong da lista de usuarios. Desse modo que eu fiz funciona, mas nao de maneira correta, tenho que sair e voltar na lista paar ver que esta apagado.

        lista_de_usuarios.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                Usuario usuarioEscolhido = (Usuario) adapter.getItem(position);
                UsuarioDAO usuarioDAO = new UsuarioDAO(getApplicationContext());
                usuarioDAO.deletar(usuarioEscolhido);
                return true;
            }
        });
    }

ja revisei as aulas e nao conegui implementar adequadamente, estou com dificuldades e gostaria mito da ajuda. ficno no aguardo.

O CURSO TA OTIMO!!

15 respostas

Opa Daniel, blz?

A estratégia é a seguinte, ao adicionar o listener a primeira coisa é abrir o dialog que vai pedir a confirmação, então, você precisa implementar o comportamento remoção dentro do listener do botão positivo do alert dialog.

new AlertDialog.Builder(context)
                .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // remove o aluno
                    }
                }).show();

Na parte de remoção, primeiro você remove do banco de dados e remove no adapter também, muito provavelmente, você está esquecendo de remover o aluno do adapter.

Revisa o seu código, veja se ele segue exatamente os detalhes que mencionei.

Muito obrigado pelo feedback do curso! Fico muito contente que esteja gostando :)

Show Instrutor entao, nao sei se pesquei a ideia hehe fiz assim e nao deu certo

 lista_de_usuarios.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {

                new AlertDialog.Builder(getApplicationContext())
                        .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Usuario usuarioEscolhido = (Usuario) adapter.getItem(position);
                                UsuarioDAO usuarioDAO = new UsuarioDAO(getApplicationContext());
                                usuarioDAO.deletar(usuarioEscolhido);
                                adapter.remove(usuarioEscolhido);
                                adapter.atualiza(usuarioDAO.findAll());
                            }
                        }).show();

                return true;
            }
        });

acredito que os codigos de atualizar e remover estao certos

public void remove(Usuario usuario) {
        usuarios.remove(usuario);
        notifyDataSetChanged();
    }

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

Opa Daniel, era isso mesmo, nem precisava atualizar o adapter depois de remover.

Faz o seguinte, me manda o seu projeto via GitHub, dessa forma eu faço o teste aqui e te passo um feedback do que está acontecendo e o que precisa ser feito para resolver, o que acha?

[]s

Poxa vai me ajudar muito meu amigo, quero ter esses exemplos, pois pode ajudar futuramente sabe. Já criei um repositório e subi o projeto nele.

aqui esta: aguardo retorno meu caro. se não for abusar muito da sua boa vontade, da uma tica sobre atualizar também.

Abraços

https://github.com/PsDaniel/AndroidStudio-Saude

Acabei de testar Daniel, fiz dois ajustes apenas:

  1. Removi o construtor da Activity de lista de usuários que recebia o Context: essa abordagem não deve ser feita no Android, Activities são classes que o próprio sistema operacional instancia pra gente, portanto, não podemos criar construtores diferentes.

  2. mudei a referência de Context enviada para o dialog, antes você estava mandando a getApplicationContext(), sendo que é esperada a referência da Activity que pode ser enviada via this:

                new AlertDialog.Builder(ListaUsuariosActivity.this)
                        .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Usuario usuarioEscolhido = adapter.getItem(position);
                                UsuarioDAO usuarioDAO = new UsuarioDAO(getApplicationContext());
                                usuarioDAO.deletar(usuarioEscolhido);
                                adapter.remove(usuarioEscolhido);
                            }
                        }).show();

Uma das coisas legais que você pode fazer no projeto é colocar o suporte ao Java 8 para usar expressão lambda (mostro no final do curso), pois fica mais simples de implementar interface funcionais (como listeners) e permite até mesmo usar o this como Context sem precisar usar o nome inteiro da Activity.

Também notei que você está usando nomes de variáveis para view usando o padrão nome_do_botao, lembre-se que no Java o padrão é o camel case, logo, tem que ser inicial minuscula e o resto maiúsculo nomeDoBotao.

Uma sugestão é dar uma olhada também no curso de RecyclerView para listar views de maneira eficiente e com mais poder e de Room para persistir o dados com mais facilidade.

[]s

solução

Muito obrigado pelas dicas instrutor, vão ser otimas daqui em diante!! Pode deixar comigo, estou terminando o curto de Persistência no Android aqui com você e vou olhar sobre a expressão lambda.

Só uma coisa, nesse código que fez a alteração, esta dando erro aqui pra min, nessa linha

Usuario usuarioEscolhido = adapter.getItem(position);

No Alt+Enter ele da opçoes de Cast, Migrate, mas não soube qual utilizar

Ah verdade, eu fiz o ajuste no adapter para que o getItem() devolvesse direto um Usuario, faça o ajuste e veja se funciona.

Ainda não funcionou, você fez as alterações no código instrutor que esta no git e enviou alguma coisa assim, ou só postou aqui? Fiquei perdido agora hehe

Só postei aqui mesmo, o que aconteceu quando você fez os ajustes? Tem algum erro específico? Evitamos ao máximo enviar todos os ajustes porque é importante o exercício do aluno analisar a situação, identificar o problema e saber resolvê-lo. Caso contrário, para futuros problemas vai ficar mais difícil de lidar, por isso é mais orientação dos passos do que código por código hehe

Com certeza instrutor, estão certíssimo haha. Bom eu fiz as ate rações que você mencionou acima, só não sei se eu as compreendi corretamente. Tirei o construtor da Activity. A referencia Context acho que não deu certo. E obre o getItem devolver um usuário eu não sakei hehe

 lista_de_usuarios.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, final long id) {

                new AlertDialog.Builder(ListaUsuariosActivity.this)
                        .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Usuario usuarioEscolhido = adapter.getItem(position);
                                UsuarioDAO usuarioDAO = new UsuarioDAO(this);
                                usuarioDAO.deletar(usuarioEscolhido);
                                adapter.remove(usuarioEscolhido);
                            }
                        }).show();

                return true;
            }
        });

Atualiza no GitHub e me avisa que te passo o feedback do seu ajuste, pode ser?

Daniel, um detalhe importante quando apresentar um feedback de erro é indicar o que você teve de erro, eu digo isso pois é exatamente o que faço quando analiso um problema de código. No geral os erros costumam dar dicas e/ou orientações de possíveis soluções.

Entendo que está tudo em Inglês e que nem todo mundo está acostumado (assim como eu não estava no começo dos estudos), mas não tem nenhum problema também pegar os trechos e jogar um tradutor para entender um pouco dos problemas, eu já fiz muito isso inclusive hehe

Consegui resolver instrutor, primeiro foi um erro de digitação e segundo, foi o que voce disse, no getItem ja devolve um usuario hehe ainda tava colocando um position nele Resolvido hehe

Muito obrigado instrutor e continue com a serie do android studio, com outras novidades APIs também, seria massa grande abraço

Boaaa! Normal, é o que mais acontece quando temos um problema hehe

Pode deixar, logo mais teremos novidades de conteúdo para Android, bons estudos :)

Não esqueça de marcar o tópico como resolvido.

[]s

Valeu instrutor, desculpa a demora haha abraço