Come posso visualizzare una vista elenco in una finestra di avviso di Android?


291

In un'applicazione Android, voglio visualizzare una visualizzazione elenco personalizzata in un AlertDialog.

Come posso fare questo?


Prendi semplicemente Elenco di stringhe, quindi crea una sequenza di CharSequence [], quindi usa AlertDialog.Builder per mostrare gli elementi. Ecco l'esempio più semplice con l'istantanea feelzdroid.com/2014/12/…
Naruto

Risposte:


498

Utilizzato sotto il codice per visualizzare un elenco personalizzato in 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();

esiste la possibilità di rilevare clic lunghi su questi elementi? sto cercando ore per una soluzione di menu popup che
funzioni

7
Presumibilmente @Shvet, show () crea e mostra la finestra di dialogo, mentre create () la crea solo.
htafoya,

Come posso usare questa configurazione ma invece di codificare il mio elenco, ho bisogno di ottenere alcuni dati dall'analisi che l'utente ha già.
Stanley Santoso,

@stanleysantoso crea il tuo adattatore, riempilo di dati e quindi impostalo come adattatore per il alertdialog: dialogBuilder.setAdapter (MyCustomAdapter); Dovrebbe funzionare
CantThinkOfAnything

1
Qual è il layout select_dialog_single_choice?
ForceFieldsForDoors

254

Secondo la documentazione , esistono tre tipi di elenchi che possono essere utilizzati con un AlertDialog:

  1. Elenco tradizionale a scelta singola
  2. Elenco a scelta singola persistente (pulsanti di opzione)
  3. Elenco a scelta multipla persistente (caselle di controllo)

Darò un esempio di ciascuno di seguito.

Elenco tradizionale a scelta singola

Il modo per creare un tradizionale elenco a scelta singola è utilizzare setItems.

inserisci qui la descrizione dell'immagine

Versione 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();

Non è necessario un pulsante OK perché non appena l'utente fa clic su un controllo della voce di elenco viene restituito a OnClickListener.

Versione di 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()

Elenco dei pulsanti di opzione

inserisci qui la descrizione dell'immagine

Il vantaggio dell'elenco dei pulsanti di opzione rispetto all'elenco tradizionale è che l'utente può vedere qual è l'impostazione corrente. Il modo per creare un elenco di pulsanti di opzione è utilizzare setSingleChoiceItems.

Versione 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();

Ho codificato a fondo l'articolo scelto qui, ma potresti tenerne traccia con una variabile membro di classe in un progetto reale.

Versione di 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()

Elenco di controllo

inserisci qui la descrizione dell'immagine

Il modo per creare un elenco di caselle di controllo è utilizzare setMultiChoiceItems.

Versione 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();

Qui ho hardcoded gli elementi nell'elenco che erano già stati controllati. È più probabile che tu voglia tenerne traccia in un ArrayList<Integer>. Vedi l' esempio di documentazione per maggiori dettagli. Puoi anche impostare gli elementi selezionati su nullse vuoi sempre che tutto inizi a non essere selezionato.

Versione di 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()

Appunti

  • Per il contextnel codice sopra, non usare getApplicationContext()o otterrai un IllegalStateException(vedi qui per il perché). Invece, ottieni un riferimento al contesto dell'attività, ad esempio con this.
  • È inoltre possibile popolare gli elementi dell'elenco da un database o da un'altra origine utilizzando setAdaptero setCursoro passando un Cursoro ListAdapternel setSingleChoiceItemso setMultiChoiceItems.
  • Se l'elenco è più lungo di quello che si adatta allo schermo, la finestra di dialogo lo scorrerà automaticamente. Se hai un elenco davvero lungo, suppongo che probabilmente dovresti creare una finestra di dialogo personalizzata con RecyclerView .
  • Per testare tutti gli esempi sopra ho appena avuto un semplice progetto con un singolo pulsante che ha mostrato la finestra di dialogo quando si fa clic:

    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
        }
    }

Relazionato


2
Questo è fantastico, ora aggiungi icone;)
AaA

1
@AaA, penso che avresti bisogno di creare una finestra di dialogo di avviso di layout personalizzato che utilizzi un RecyclerViewnel layout per quello.
Suragch,

cosa significa il metodo "quale" nella finestra di dialogo onclick?
gophishing,

@gonephishing, secondo la documentazione , è "il pulsante su cui è stato fatto clic (es. BUTTON_POSITIVE) o la posizione dell'elemento su cui è stato fatto clic".
Suragch,

1
Se vuoi implementare un semplice elenco (1) con un adattatore personalizzato, usa Builder.setAdapter(ListAdapter, DialogInterface.OnClickListener): whichin listener onClicksarà uguale alla posizione dell'elemento cliccato. Builder.setOnItemSelectedListenernon avrà alcun effetto.
Miha_x64,

122

È possibile utilizzare una finestra di dialogo personalizzata.

Layout della finestra di dialogo personalizzata. 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>

Nella tua attività

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();

Modificare:

Utilizzando 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>

schiocco

inserisci qui la descrizione dell'immagine


1
@Juan - devtopia.coop hai modificato il mio post dopo aver votato solo per votare. Potresti commentare cosa c'è che non va
Raghunandan,

Niente con la versione corrente, la precedente mancava di tutto il materiale dell'adattatore e quindi mostrava solo un ListView vuoto, ora rimuovo volentieri il mio voto negativo. Ho votato su una risposta incompleta, non su questa modifica di 3 ore fa.
Juan Cortés,

@Raghunandan, ho usato il tuo codice ma ho ottenuto un'eccezione su lv.setAdapter (adattatore); linea, puoi aiutarmi?
Ahmad Vatani,

@Ahmad qual è l'eccezione?
Raghunandan,

1
@NeilGaliaskarov sì, è scorrevole. Listview scorrerà
Raghunandan il

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();

1
Cos'è m.DoneButton?
ForceFieldsForDoors

2
@ArhatBaid Ma setItems non funziona quando inserisco un messaggio in setMessage. Ho cercato su Google, ma la risposta che ho trovato è stata quella di impostare il messaggio in setTitle. Ma il problema è risolto Il titolo consente solo un numero limitato di caratteri. C'è un modo per usare setMessage e setItems nella finestra di avviso?
David,

@David per questo devi andare per la finestra di dialogo personalizzata.
Arhat Baid,

1
Questa soluzione è molto bello perché si può anche andare con un ListAdaptercon setSingleChoiceItems(molto simile alla chiamata di cui sopra)
snotyak

Perfetto come previsto ... gestisce centinaia di articoli con un codice minimo. :)
jeet.chanchawat,

10

Usa " import android.app.AlertDialog;" import e poi scrivi

    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();

avevi bisogno di bc con create hai creato l'AlertDialog e lo hai mostrato allora. non il costruttore. (c) Facebamm
Facebamm,

@Facebamm non è vero. show()fa entrambe le cose. Calling this method is functionally identical to: AlertDialog dialog = builder.create(); dialog.show();questo è direttamente dalla show()documentazione del metodo
ᴛʜᴇᴘᴀᴛᴇʟ

esatto ma a volte ho alcuni errori visibilmente delle interfacce utente. (c) Facebamm
Facebamm

No non è vero. show () è identico a create (). show (); / ** * Crea un {@link AlertDialog} con gli argomenti forniti a questo * builder e visualizza immediatamente la finestra di dialogo. * <p> * La chiamata a questo metodo è funzionalmente identica a: * <pre> * AlertDialog dialog = builder.create (); * dialog.show (); * </pre> * / public AlertDialog show () {final AlertDialog dialog = create (); Dialog.Show (); dialogo di ritorno; }
Emanuel S,

ok, ho provato per un po 'e dico sry, questo è vero. (c) Facebamm
Facebamm,

4

Questo è troppo semplice

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();

3

Come principiante, ti suggerisco di consultare http://www.mkyong.com/android/android-custom-dialog-example/

Dirò cosa sostanzialmente fa

  1. Crea un file XML per la finestra di dialogo e l'attività principale
  2. Nell'attività principale nel posto richiesto crea un oggetto di classe Android Dialog
  3. Aggiunge stile e testo personalizzati in base al file XML
  4. Chiama il dialog.show()metodo.

1

A 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()
}

1
Aggiungi una descrizione alla tua risposta.
Mathews Sunny

1
Che tipo di descrizione?
Varsha Prabhakar,

1

Ecco come mostrare la finestra di dialogo del layout personalizzato con la voce di elenco personalizzata, che può essere personalizzata secondo le tue esigenze.

inserisci qui la descrizione dell'immagine

PASSAGGIO - 1 Creare il layout di DialogBox, ovvero: -

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>

PASSAGGIO - 2 Creare un layout di elemento elenco personalizzato secondo la logica aziendale

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>

PASSAGGIO - 3 Creare una classe del modello dati a propria scelta

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;
}

}

PASSAGGIO - 4 Creare un adattatore personalizzato

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;
}

}

PASSAGGIO - 5 Creare questa funzione e fornire ArrayList del modello di dati sopra riportato in questo metodo

// 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();
    }

Step - 6 Dare lo sfondo dell'angolo arrotondato alla finestra di dialogo

@ 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>

0

Non è più semplice creare un metodo da chiamare dopo la creazione dell'unità EditText in un AlertDialog, per uso generale?

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;
        }
    });
}

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();

}

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Piotr Labunski il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.