Como posso exibir uma exibição de lista em uma caixa de diálogo de alerta do Android?

291

Em um aplicativo Android, desejo exibir uma exibição de lista personalizada em um AlertDialog.

Como posso fazer isso?

Brad Larson
fonte
Apenas pegue Lista de strings, crie uma sequência de CharSequence [] e use AlertDialog.Builder para mostrar os itens. Aqui está o exemplo mais simples com o instantâneo feelzdroid.com/2014/12/…
Naruto

Respostas:

498

Usado abaixo do código para exibir a lista personalizada no AlertDialog

AlertDialog.Builder builderSingle = new AlertDialog.Builder(DialogActivity.this);
builderSingle.setIcon(R.drawable.ic_launcher);
builderSingle.setTitle("Select One Name:-");

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(DialogActivity.this, android.R.layout.select_dialog_singlechoice);
arrayAdapter.add("Hardik");
arrayAdapter.add("Archit");
arrayAdapter.add("Jignesh");
arrayAdapter.add("Umang");
arrayAdapter.add("Gatti");

builderSingle.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

builderSingle.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String strName = arrayAdapter.getItem(which);
                AlertDialog.Builder builderInner = new AlertDialog.Builder(DialogActivity.this);
                builderInner.setMessage(strName);
                builderInner.setTitle("Your Selected Item is");
                builderInner.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,int which) {
                                dialog.dismiss();
                            }
                        });
                builderInner.show();
            }
        });
builderSingle.show();
karan singh rajpoot
fonte
existe alguma possibilidade de detectar cliques longos nesses itens? eu estou olhando por horas para uma solução menu pop-up que funciona em todos os níveis da API
wutzebaer
7
@Shvet supostamente, show () cria e mostra a caixa de diálogo, enquanto create () apenas a cria.
Htafoya #
Como posso usar essa configuração, mas em vez de codificar minha lista, preciso obter alguns dados da análise que o usuário já possui.?
Stanley santoso
@stanleysantoso crie seu próprio adaptador, preencha-o com dados e, em seguida, defina-o como o adaptador para o dial de alerta: dialogBuilder.setAdapter (MyCustomAdapter); Isso deve funcionar
CantThinkOfAnything
1
Qual é o layout select_dialog_single_choice?
ForceFieldsForDoors
254

De acordo com a documentação , existem três tipos de listas que podem ser usadas com um AlertDialog:

  1. Lista tradicional de escolha única
  2. Lista de escolha única persistente (botões de opção)
  3. Lista de múltipla escolha persistente (caixas de seleção)

Vou dar um exemplo de cada um abaixo.

Lista tradicional de escolha única

A maneira de fazer uma lista tradicional de escolha única é usar setItems.

insira a descrição da imagem aqui

Versão Java

// setup the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose an animal");

// add a list
String[] animals = {"horse", "cow", "camel", "sheep", "goat"};
builder.setItems(animals, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which) {
            case 0: // horse
            case 1: // cow
            case 2: // camel
            case 3: // sheep
            case 4: // goat
        }
    }
});

// create and show the alert dialog
AlertDialog dialog = builder.create();
dialog.show();

Não há necessidade de um botão OK, porque assim que o usuário clica em um controle de item da lista é retornado para OnClickListener.

Versão Kotlin

// setup the alert builder
val builder = AlertDialog.Builder(context)
builder.setTitle("Choose an animal")

// add a list
val animals = arrayOf("horse", "cow", "camel", "sheep", "goat")
builder.setItems(animals) { dialog, which ->
    when (which) {
        0 -> { /* horse */ }
        1 -> { /* cow   */ }
        2 -> { /* camel */ }
        3 -> { /* sheep */ }
        4 -> { /* goat  */ }
    }
}

// create and show the alert dialog
val dialog = builder.create()
dialog.show()

Lista de botões de opção

insira a descrição da imagem aqui

A vantagem da lista de botões de opção sobre a lista tradicional é que o usuário pode ver qual é a configuração atual. A maneira de fazer uma lista de botões de opção é usar setSingleChoiceItems.

Versão Java

// setup the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose an animal");

// add a radio button list
String[] animals = {"horse", "cow", "camel", "sheep", "goat"};
int checkedItem = 1; // cow
builder.setSingleChoiceItems(animals, checkedItem, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        // user checked an item
    }
});

// add OK and Cancel buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        // user clicked OK
    }
});
builder.setNegativeButton("Cancel", null);

// create and show the alert dialog
AlertDialog dialog = builder.create();
dialog.show();

Eu codifiquei o item escolhido aqui, mas você pode acompanhá-lo com uma variável de membro da classe em um projeto real.

Versão Kotlin

// setup the alert builder
val builder = AlertDialog.Builder(context)
builder.setTitle("Choose an animal")

// add a radio button list
val animals = arrayOf("horse", "cow", "camel", "sheep", "goat")
val checkedItem = 1 // cow
builder.setSingleChoiceItems(animals, checkedItem) { dialog, which ->
    // user checked an item
}


// add OK and Cancel buttons
builder.setPositiveButton("OK") { dialog, which ->
    // user clicked OK
}
builder.setNegativeButton("Cancel", null)

// create and show the alert dialog
val dialog = builder.create()
dialog.show()

Lista de caixas de seleção

insira a descrição da imagem aqui

A maneira de fazer uma lista de caixas de seleção é usar setMultiChoiceItems.

Versão Java

// setup the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose some animals");

// add a checkbox list
String[] animals = {"horse", "cow", "camel", "sheep", "goat"};
boolean[] checkedItems = {true, false, false, true, false};
builder.setMultiChoiceItems(animals, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        // user checked or unchecked a box
    }
});

// add OK and Cancel buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        // user clicked OK
    }
});
builder.setNegativeButton("Cancel", null);

// create and show the alert dialog
AlertDialog dialog = builder.create();
dialog.show();

Aqui eu codifiquei os itens na lista que já foram verificados. É mais provável que você queira acompanhá-los em um arquivo ArrayList<Integer>. Veja o exemplo da documentação para mais detalhes. Você também pode definir os itens marcados como nullse quiser sempre que tudo comece desmarcado.

Versão Kotlin

// setup the alert builder
val builder = AlertDialog.Builder(context)
builder.setTitle("Choose some animals")

// add a checkbox list
val animals = arrayOf("horse", "cow", "camel", "sheep", "goat")
val checkedItems = booleanArrayOf(true, false, false, true, false)
builder.setMultiChoiceItems(animals, checkedItems) { dialog, which, isChecked ->
    // user checked or unchecked a box
}

// add OK and Cancel buttons
builder.setPositiveButton("OK") { dialog, which ->
    // user clicked OK
}
builder.setNegativeButton("Cancel", null)

// create and show the alert dialog
val dialog = builder.create()
dialog.show()

Notas

  • Para o contextcódigo acima, não use getApplicationContext()ou você receberá um IllegalStateException(veja aqui o porquê). Em vez disso, obtenha uma referência ao contexto da atividade, como com this.
  • Você também pode preencher os itens da lista de um banco de dados ou de outra fonte usando setAdapterou setCursorou passar em um Cursorou ListAdapterno setSingleChoiceItemsou setMultiChoiceItems.
  • Se a lista for mais longa do que caberá na tela, a caixa de diálogo a rolará automaticamente. Porém, se você tiver uma lista muito longa, acho que você provavelmente deve criar uma caixa de diálogo personalizada com um RecyclerView .
  • Para testar todos os exemplos acima, acabei de ter um projeto simples com um único botão que mostrava a caixa de diálogo quando clicada:

    import android.support.v7.app.AppCompatActivity;
    
    public class MainActivity extends AppCompatActivity {
    
        Context context;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            context = this;
        }
    
        public void showAlertDialogButtonClicked(View view) {
    
            // example code to create alert dialog lists goes here
        }
    }

Relacionado

Suragch
fonte
2
Isso é ótimo, agora adicionar ícones;)
AaA
1
@AaA, acho que você precisaria criar um diálogo de alerta de layout personalizado que use um RecyclerViewno layout para isso.
Suragch 15/08/19
o que significa o 'what' no diálogo onclick método?
precisa saber é o seguinte
@gonephishing, de acordo com a documentação , é "o botão que foi clicado (ex. BUTTON_POSITIVE) ou a posição do item clicado".
Suragch 20/09/17
1
Se você deseja implementar uma lista simples (1) com um adaptador personalizado, use Builder.setAdapter(ListAdapter, DialogInterface.OnClickListener): whichno listener onClickserá igual à posição do item clicado. Builder.setOnItemSelectedListenernão terá efeito.
Miha_x64
122

Você pode usar uma caixa de diálogo personalizada.

Layout de caixa de diálogo personalizado. list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ListView
        android:id="@+id/lv"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"/>
</LinearLayout>

Na sua atividade

Dialog dialog = new Dialog(Activity.this);
       dialog.setContentView(R.layout.list)

ListView lv = (ListView ) dialog.findViewById(R.id.lv);
dialog.setCancelable(true);
dialog.setTitle("ListView");
dialog.show();

Editar:

Usando o alertdialog

String names[] ={"A","B","C","D"};
AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
LayoutInflater inflater = getLayoutInflater();
View convertView = (View) inflater.inflate(R.layout.custom, null);
alertDialog.setView(convertView);
alertDialog.setTitle("List");
ListView lv = (ListView) convertView.findViewById(R.id.lv);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,names);
lv.setAdapter(adapter);
alertDialog.show();

custom.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

</ListView>

Snap

insira a descrição da imagem aqui

Raghunandan
fonte
1
@Juan - devtopia.coop você editou meu post depois da votação apenas para voto negativo. Você poderia comentar o que está errado
Raghunandan
Nada na versão atual, a anterior estava sem todas as coisas do adaptador e, portanto, estava apenas mostrando um ListView vazio, removo com prazer o meu voto negativo agora. Votei em uma resposta incompleta, e não nesta edição de 3 horas atrás.
Juan Cortés
@Raghunandan, usei seu código, mas recebi uma exceção no lv.setAdapter (adapter); line, você pode me ajudar?
Ahmad Vatani 23/02
@ Ahmad, qual é a exceção?
Raghunandan
1
@NeilGaliaskarov sim, é rolável. Listview será
rolado
44
final CharSequence[] items = {"A", "B", "C"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Make your selection");
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        // Do something with the selection
        mDoneButton.setText(items[item]);
    }
});
AlertDialog alert = builder.create();
alert.show();
Arhat Baid
fonte
1
O que é m.DoneButton?
ForceFieldsForDoors
2
@ArhatBaid Mas setItems não está funcionando quando coloco uma mensagem em setMessage. Eu procurei no google, mas a resposta que encontrei foi definir a mensagem em setTitle. Mas o problema é setTitle permite apenas um pequeno número de caracteres. Existe uma maneira de usar setMessage e setItems na caixa de diálogo de alerta?
David
@ David por isso você tem que ir para o diálogo personalizado.
Arhat Baid
1
Esta solução é muito bom porque você também pode ir com um ListAdaptercom setSingleChoiceItems(muito semelhante à chamada acima)
snotyak
Perfeito como esperado ... lida com centenas de itens com o mínimo de código. :)
jeet.chanchawat
10

Use a import android.app.AlertDialog;importação " " e depois escreva

    String[] items = {"...","...."};             
    AlertDialog.Builder build = new AlertDialog.Builder(context);
    build.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //do stuff....
        }
    }).create().show();
Facebamm
fonte
você precisava bc com create, você cria o AlertDialog e mostra isso então. não o construtor. (c) Facebamm
Facebamm
@Facebamm isso não é verdade. show()faz os dois. Calling this method is functionally identical to: AlertDialog dialog = builder.create(); dialog.show();que é diretamente da show()documentação do método
ᴛʜᴇᴘᴀᴛᴇʟ
isso mesmo, mas às vezes eu tenho alguns erros visíveis nas interfaces do usuário. (c) Facebamm
Facebamm
Não Isso não é verdade. show () é idêntico a create (). show (); / ** * Cria um {@link AlertDialog} com os argumentos fornecidos para este * construtor e exibe imediatamente a caixa de diálogo. * <p> * A chamada desse método é funcionalmente idêntica a: * <pre> * AlertDialog dialog = builder.create (); * dialog.show (); * </pre> * / public AlertDialog show () {final AlertDialog dialog = create (); dialog.show (); retornar caixa de diálogo; }
Emanuel S
ok, eu testei por um tempo e digo sry, isso é verdade. (c) Facebamm
Facebamm
4

Isso é muito simples

final CharSequence[] items = {"Take Photo", "Choose from Library", "Cancel"};

AlertDialog.Builder builder = new AlertDialog.Builder(MyProfile.this);

builder.setTitle("Add Photo!");
builder.setItems(items, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int item) {
        if (items[item].equals("Take Photo")) {
            getCapturesProfilePicFromCamera();
        } else if (items[item].equals("Choose from Library")) {
            getProfilePicFromGallery();
        } else if (items[item].equals("Cancel")) {
            dialog.dismiss();
        }
    }
});
builder.show();
Jaydeep purohit
fonte
3

Como iniciante, sugiro que você acesse http://www.mkyong.com/android/android-custom-dialog-example/

Vou resumir o que basicamente faz

  1. Cria um arquivo XML para o diálogo e a Atividade principal
  2. Na atividade principal no local necessário cria um objeto da classe android Dialog
  3. Adiciona estilo e texto personalizados com base no arquivo XML
  4. Chama o dialog.show()método
cjds
fonte
1

Em Kotlin:

fun showListDialog(context: Context){
    // setup alert builder
    val builder = AlertDialog.Builder(context)
    builder.setTitle("Choose an Item")

    // add list items
    val listItems = arrayOf("Item 0","Item 1","Item 2")
    builder.setItems(listItems) { dialog, which ->
        when (which) {
            0 ->{
                Toast.makeText(context,"You Clicked Item 0",Toast.LENGTH_LONG).show()
                dialog.dismiss()
            }
            1->{
                Toast.makeText(context,"You Clicked Item 1",Toast.LENGTH_LONG).show()
                dialog.dismiss()
            }
            2->{
                Toast.makeText(context,"You Clicked Item 2",Toast.LENGTH_LONG).show()
                dialog.dismiss()
            }
        }
    }

    // create & show alert dialog
    val dialog = builder.create()
    dialog.show()
}
Varsha Prabhakar
fonte
1
Adicione alguma descrição à sua resposta.
Mathews Sunny
1
Que tipo de descrição?
Varsha Prabhakar
1

Isto é como mostrar o diálogo de layout personalizado com o item de lista personalizado, pode ser personalizado conforme sua exigência.

insira a descrição da imagem aqui

PASSO - 1 Crie o layout da caixa de diálogo, ou seja: -

R.layout.assignment_dialog_list_view

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/rectangle_round_corner_assignment_alert"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tv_popup_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:singleLine="true"
        android:paddingStart="4dp"
        android:text="View as:"
        android:textColor="#4f4f4f" />

    <ListView
        android:id="@+id/lv_assignment_users"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</LinearLayout>

PASSO - 2 Crie um layout de item de lista personalizado conforme sua lógica de negócios

R.layout.item_assignment_dialog_list_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:padding="4dp"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/iv_user_profile_image"
        android:visibility="visible"
        android:layout_width="42dp"
        android:layout_height="42dp" />
    <TextView
        android:id="@+id/tv_user_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="8dp"
        android:layout_marginStart="8dp"
        android:paddingBottom="8dp"
        android:textColor="#666666"
        android:textSize="18sp"
        tools:text="ABCD XYZ" />
</LinearLayout>

PASSO - 3 Crie uma classe de modelo de dados de sua própria escolha

public class AssignmentUserModel {

private String userId;
private String userName;
private String userRole;
private Bitmap userProfileBitmap;

public AssignmentUserModel(String userId, String userName, String userRole, Bitmap userProfileBitmap) {
    this.userId = userId;
    this.userName = userName;
    this.userRole = userRole;
    this.userProfileBitmap = userProfileBitmap;
}


public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getUserRole() {
    return userRole;
}

public void setUserRole(String userRole) {
    this.userRole = userRole;
}

public Bitmap getUserProfileBitmap() {
    return userProfileBitmap;
}

public void setUserProfileBitmap(Bitmap userProfileBitmap) {
    this.userProfileBitmap = userProfileBitmap;
}

}

PASSO - 4 Crie um adaptador personalizado

public class UserListAdapter extends ArrayAdapter<AssignmentUserModel> {
private final Context context;
private final List<AssignmentUserModel> userList;

public UserListAdapter(@NonNull Context context, int resource, @NonNull List<AssignmentUserModel> objects) {
    super(context, resource, objects);
    userList = objects;
    this.context = context;
 }

@SuppressLint("ViewHolder")
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.item_assignment_dialog_list_layout, parent, false);
    ImageView profilePic = rowView.findViewById(R.id.iv_user_profile_image);
    TextView userName = rowView.findViewById(R.id.tv_user_name);
    AssignmentUserModel user = userList.get(position);

    userName.setText(user.getUserName());

    Bitmap bitmap = user.getUserProfileBitmap();

    profilePic.setImageDrawable(bitmap);

    return rowView;
}

}

PASSO - 5 Crie esta função e forneça ArrayList do modelo de dados acima neste método

// Pass list of your model as arraylist
private void showCustomAlertDialogBoxForUserList(ArrayList<AssignmentUserModel> allUsersList) {
        final Dialog dialog = new Dialog(mActivity);
        dialog.setContentView(R.layout.assignment_dialog_list_view);
        if (dialog.getWindow() != null) {
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); // this is optional
        }
        ListView listView = dialog.findViewById(R.id.lv_assignment_users);
        TextView tv = dialog.findViewById(R.id.tv_popup_title);
        ArrayAdapter arrayAdapter = new UserListAdapter(context, R.layout.item_assignment_dialog_list_layout, allUsersList);
        listView.setAdapter(arrayAdapter);
        listView.setOnItemClickListener((adapterView, view, which, l) -> {
            Log.d(TAG, "showAssignmentsList: " + allUsersList.get(which).getUserId());
           // TODO : Listen to click callbacks at the position
        });
        dialog.show();
    }

Etapa - 6 Dando fundo ao canto redondo à caixa de diálogo

@ drawable / rectangle_round_corner_assignment_alert

    <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffffff" />
    <corners android:radius="16dp" />
    <padding
        android:bottom="16dp"
        android:left="16dp"
        android:right="16dp"
        android:top="16dp" />
</shape>
Divyanshu Kumar
fonte
0

Não é mais fácil criar um método para ser chamado após a criação da unidade EditText em um AlertDialog, para uso geral?

public static void EditTextListPicker(final Activity activity, final EditText EditTextItem, final String SelectTitle, final String[] SelectList) {
    EditTextItem.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(activity);
            builder.setTitle(SelectTitle);
            builder.setItems(SelectList, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int item) {
                    EditTextItem.setText(SelectList[item]);
                }
            });
            builder.create().show();
            return false;
        }
    });
}
Jan Bergström
fonte
0
private void AlertDialogue(final List<Animals> animals) {
 final AlertDialog.Builder alertDialog = new AlertDialog.Builder(AdminActivity.this);
 alertDialog.setTitle("Filter by tag");

 final String[] animalsArray = new String[animals.size()];

 for (int i = 0; i < tags.size(); i++) {
  animalsArray[i] = tags.get(i).getanimal();

 }

 final int checkedItem = 0;
 alertDialog.setSingleChoiceItems(animalsArray, checkedItem, new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {

   Log.e(TAG, "onClick: " + animalsArray[which]);

  }
 });


 AlertDialog alert = alertDialog.create();
 alert.setCanceledOnTouchOutside(false);
 alert.show();

}
Sahil Gaikwad
fonte
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
Piotr Labunski 18/03