[RESOLVIDO] - Android studio - Colocando um ListView dentro de um AlertDialog.Builder dá repetição do ListView

18 respostas Resolvido
java
W

Boa noite.

Estou colocando um ListView dentro de um AlertDialog.Builder e chamo esse AlertDialog.Builder num Botão (Button).

Quando clico no Botão, o ListView aparece normalmente no AlertDialog.Builder, mas quando clico pela segunda vez, o ListView aparece dobrado. A cada clique no Button, ele dobra mais ainda. Ex.:

Suponha que a lista tem 5 turnos (O Adapter é customizado e o Array é de Turnos).

Quando clico no botão (Button) pela primeira vez chamando a lista no alert, aparecem os 5 turnos, mas quando clico pela segunda vez aparecem 10, 5 + 5 de novo, repetidos em ordem. Se clicar pela terceira vez, ele aparece 15, 5 + 5 + 5 e assim vai.

Eu quero que a cada clique só seja exibida a lista como pela primeira vez, apenas os 5 turnos. Código abaixo:

O BUTTON com o ALERTDIALOG.BUILDER:

btListaTurno.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v){
                AlertDialog.Builder box = new AlertDialog.Builder(InserirHorario.this);
                box.setView(listaTurnos());
                box.show();
           }
      });

A LISTA (LISTVIEW):

public ListView listaTurnos(){
      Cursor resultado = banco.listarTurnosBanco();
      if(resultado.getCount() == 0){
           Toast.makeText(this, "LISTA VAZIA!", Toast.LENGTH_SHORT).show();
           finish();
      }
      else{
           while(resultado.moveToNext()){
                String idDTurno = resultado.getString(resultado.getColumnIndex("ID_TURNO"));
                String inicioTurno = resultado.getString(resultado.getColumnIndex("INICIO_TURNO"));
                String finalTurno = resultado.getString(resultado.getColumnIndex("FINAL_TURNO"));
                String nomeTurno = resultado.getString(resultado.getColumnIndex("NOME_TURNO"));

                turno = new Turno(idDTurno, inicioTurno, finalTurno, nomeTurno);

                arrayList.add(turno);
                adapterCustomizadoTurno = new AdapterCustomizadoTurno(this, arrayList);
                listView = new ListView(this);
                listView.setAdapter(adapterCustomizadoTurno);

                listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
                     @Override
                     public void onItemClick(AdapterView<?> parent, final View view, final int posicao, long id){
                          // Turno Clicado na Lista
                          turno = adapterCustomizadoTurno.getItem(posicao);
                     }
                });
           }
      }
      return listView;
 }

Desde Já mt obg!

18 Respostas

R

como vc ta fechando o alertDialgog?

W

Desse jeito:

btListaTurno.setOnClickListener(new View.OnClickListener(){
       @Override
       public void onClick(View v){
            AlertDialog.Builder box = new AlertDialog.Builder(InserirHorario.this);
            box.setView(listaTurnos());
            box.show();
       }
  });

Se eu colocar um finish() ele sai da Aba.

R

mas assim ta abrindo e nao fechando

W

Rapaz… Já tentei fechar ele desde o ListView e nd… Como vc sugere?

R

Tenta assim

private Dialog dialog;
 private void openDialogNegative() {
        if (dialog == null) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setCancelable(false);

            View itemView = getLayoutInflater().inflate(R.layout.seuLayout, null);
            builder.setView(itemView);

            Button botaoDeFechar = itemView.findViewById(R.id.fechar);

            botaoDeFechar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dialog.dismiss();
                }
            });

            dialog= builder.create();
            dialog.show();
        } else {
            dialog.show();
        }

    }
W

Entendo que tenha outras formas de fazer oq to querendo, mas tem como resolver esse problema no contexto que coloquei? Tipo, não tô inflatando a lista, tenho um método que traz minha lista do banco prontinho me retornando o ListView.

R

só tirar o inflater kkkk

W

Nesse caso o botão ficaria dentro do método, em vez de o método ficar dentro do botão, como é a lógica neh, tipo, vc primeiro clica no botão e depois é que ele tras a lista. Do jeito que vc falou o método é executado antes msm de eu clicar no botão. Ou não?

R

então, pra poder te responder, eu preciso saber quando vc fecha o dialog.

E qual botão vc ta falando? de fechar? de preencher?

W

De vdd, vc viu meu código?

R
public ListView listaTurnos(){
      Cursor resultado = banco.listarTurnosBanco();
      if(resultado.getCount() == 0){
           Toast.makeText(this, "LISTA VAZIA!", Toast.LENGTH_SHORT).show();
           finish();
      }
      else{
           while(resultado.moveToNext()){
                String idDTurno = resultado.getString(resultado.getColumnIndex("ID_TURNO"));
                String inicioTurno = resultado.getString(resultado.getColumnIndex("INICIO_TURNO"));
                String finalTurno = resultado.getString(resultado.getColumnIndex("FINAL_TURNO"));
                String nomeTurno = resultado.getString(resultado.getColumnIndex("NOME_TURNO"));

                turno = new Turno(idDTurno, inicioTurno, finalTurno, nomeTurno);

                arrayList.add(turno);
                adapterCustomizadoTurno = new AdapterCustomizadoTurno(this, arrayList);
                listView = new ListView(this);
                listView.setAdapter(adapterCustomizadoTurno);

                listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
                     @Override
                     public void onItemClick(AdapterView<?> parent, final View view, final int posicao, long id){
                          // Turno Clicado na Lista
                          turno = adapterCustomizadoTurno.getItem(posicao);
                     }
                });
           }
      }
      return listView;
 }

acredito que seja esse que vc esteja falando, e não vi nada de dialog aí, se está aí eu to cego.


Se estiver falando desse:

btListaTurno.setOnClickListener(new View.OnClickListener(){
       @Override
       public void onClick(View v){
            AlertDialog.Builder box = new AlertDialog.Builder(InserirHorario.this);
            box.setView(listaTurnos());
            box.show();
       }
  });

pior ainda, só ta dando um show no dialog

W

btListaTurno >> Botão
AlertDialog.Builder box <<<

Tô fazendo oq vc postou, jaja te dou um retorno.
Vc falou em fechá-lo e eu disse que não consegui, tinha tentado desde o ListView, mas sem efeito.

R

Então, o que eu to querendo dizer é, vc abre esse dialog, legal isso eu ja sei. Agora vc precisa sair dele, certo? Seja clicando fora dele, ou em um botão…

Como vc fechava? Ou nao fechava?

W

O AlertDialog.Builder não. Até onde eu vi, não tem nenhum método que faz isso, se tem eu não vi. Já o ListView eu tava fazendo errado msm, já oq vc mando pra mim, deixei ele assim:

private void openDialogNegative() {
      if (dialog == null) {
           final AlertDialog.Builder box = new AlertDialog.Builder(this);
           box.setCancelable(false);
           box.setView(listaTurnos());

           btListaTurno.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                     dialog.dismiss();
                }
           });

           dialog= box.create();
           dialog.show();
      }
      else {
           dialog.show();
      }
 }

E chamei o método no onCreate. Ele exibe a lista assim que rodo e ela não sai da tela kkkkkk… Como eu disse, quero que ela só seja exibida quando clicar no botão. Se deixar ela assim como vc falou, não rola… infelizmente.

R
Solucao aceita

Mas vc abria um dialog pra nao fechar nunca mais? Como vc nao ta usando nenhum inflater, nao pode ter esse botão aí, uma coisa que vc pode fazer pra fechar é clicar fora da tela:

private Dialog dialog;
 private void openDialogNegative() {
      if (dialog == null) {
           final AlertDialog.Builder box = new AlertDialog.Builder(this);
           box.setCancelable(true);
           box.setView(listaTurnos());

           dialog= box.create();
           dialog.show();

          //adiciona um listener pra saber qnd ele clicar fora do dialog
          dialog.setOnCancelListener(dialog -> {
            dialog.hide();
            dialog = null;
          });
      } else {
         dialog.show();
      }
 }
W

Oush, viajei nessa linha: dialog.setOnCancelListener(dialog -> {

Ele não reconhece o >>> .hide() <<<

R

Ah sim, deixa só o null entao


alias, faz assim:

//adiciona um listener pra saber qnd ele clicar fora do dialog
      dialog.setOnCancelListener(meuDialog -> {
          dialog.hide();
          dialog= null;
      });
W

Fiz como vc falou antes. Resolveu! Assim:

private void openDialogNegative() {
      if (dialog == null) {
           final AlertDialog.Builder box = new AlertDialog.Builder(this);
           box.setCancelable(true);
           box.setView(listaTurnos());

           dialog= box.create();
           dialog.show();

           //adiciona um listener pra saber qnd ele clicar fora do dialog
           dialog.setOnCancelListener(new DialogInterface.OnCancelListener(){
                @Override
                public void onCancel(DialogInterface dialog){
                     dialog = null;
                }
           });
      }
      else {
           dialog.show();
      }
 }

Chamo ele dentro do Botão, daí a lista só aparece quando eu clico nele. vc é Ph0d@ msm :facepunch:

O lance era colocar a lista dentro do Alert e depois colocar o Alert dentro do botão, eu tava fazendo sem esse intermediário, por isso não tava indo.

Criado 6 de maio de 2020
Ultima resposta 7 de mai. de 2020
Respostas 18
Participantes 2