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;
}
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.
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?
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…
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.
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();
}
}