2010-01-29 7 views
8

J'essaie de rendre la liste d'éléments dynamique, donc je peux ajouter à l'exécution, mais je n'ai aucune idée. CharSeqence n'est pas dynamique, et aucune idée de comment utiliser l'option d'adaptateur, comment pourrais-je changer mon code pour être dynamique?dynamicdialog dynamique avec des boutons radio

private void alertDialogLoadFile() { 

    AlertDialog.Builder alert = new AlertDialog.Builder(this); 
    alert.setTitle("Choose:"); 
    CharSequence[] items = { "moshe", "yosi", "ee" }; 
    alert.setSingleChoiceItems(m_items , -1, new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int item){ 
      /* User clicked on a radio button do some stuff */ 
     } 
    }); 

    alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int id) { 
    } 
    }); 

    alert.setNegativeButton("No", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int id) { 
      dialog.cancel(); 
     } 
    }); 


    AlertDialog ad = alert.create(); 
    ad.show(); 

} 
+0

Qu'entendez-vous par dynamique? Vous voulez que les choix soient variables à l'exécution? Qui décide quels sont les choix? –

+0

Je veux qu'ils soient créés au moment de l'exécution, comme ces choix sont récupérés à partir de certaines bases de données, donc vous ne pouvez pas choisir les éléments qui seront dans la boîte de dialogue d'alerte avant. – rayman

Répondre

1

Si vous créez la boîte de dialogue dans onCreateDialog(), vous pouvez mettre en œuvre onPrepareDialog() de changer les choix avant qu'il ne soit affiché à l'utilisateur. Par exemple:

protected void onPrepareDialog(int id, Dialog dialog) {  
    if (id == YOUR_DIALOG_ID) { 

     // Create new adapter 
     ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(); 
     adapter.add("new items ..."); 
     ... 

     // Use the new adapter 
     AlertDialog alert = (AlertDialog) dialog; 
     alert.getListView().setAdapter(adapter); 
    } 
} 

Vous pouvez également obtenir le même effet en obtenant l'adaptateur de la boîte de dialogue (et la coulée au type correct) et en ajoutant ou en supprimant les éléments comme bon vous semble. Je pencherais probablement vers la simple création d'un nouvel adaptateur, car vous n'aurez pas à vous soucier de la conversion de la valeur de getListAdapter() au mauvais type. Cependant, la réutilisation de l'adaptateur est probablement un peu plus efficace en termes de mémoire.

+0

ArrayAdapter adaptateur = new ArrayAdapter (); vous ne pouvez pas l'utiliser de cette façon, il n'y a pas de constructeur defualt. – rayman

1
@Override 
protected void onPrepareDialog(int id, Dialog dialog) { 

    super.onPrepareDialog(id, dialog); 

    if (id == DIALOG_PHONE_SELECT) { 

     ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(CallBack.this, android.R.layout.select_dialog_item, availablePhones); 
     ((AlertDialog) dialog).getListView().setAdapter(adapter); 

    } 
} 

vous pouvez utiliser "android.R.layout.select_dialog_item" - dialogue sans bouton OK ou "android.R.layout.select_dialog_singlechoice" avec le bouton OK

2

si vous utilisez un constructeur, essayez ceci:

ArrayAdapter<CharSequence> itensAdapter = new ArrayAdapter<CharSequence>(); 
itensAdapter.add("whatever"); 

builder = new AlertDialog.Builder(CalculatorActivity.this); 
builder.setTitle("Escolha uma opção"); 
builder.setAdapter(itensAdapter, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
       removeDialog(DIALOG_AREA); 
     } 
    }); 
dialog = builder.create(); 
+0

Il n'y a pas de constructeur par défaut pour ArrayAdapter donc il devrait ressembler à: ArrayAdapter itensAdapter = new ArrayAdapter (ceci, R.layout.list); – EtienneSky