2010-01-29 6 views
8

Estoy tratando de hacer la lista de elementos dinámica, por lo que puedo agregar a ella en tiempo de ejecución, pero no tengo ni idea. CharSeqence no es dinámico, y no tiene ni idea de cómo usar la opción de adaptador, ¿cómo podría cambiar mi código para que sea dinámico?alerta dinámica de diálogo con botones de 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é quiere decir dinámico? ¿Desea que las opciones sean variables en tiempo de ejecución? ¿Quién está decidiendo cuáles son las opciones? –

+0

Quiero que se creen en tiempo de ejecución, al igual que esas opciones se están recuperando de alguna base de datos, por lo que no puede elegir qué elementos estarán en el cuadro de diálogo de alerta antes. – rayman

Respuesta

1

Si crea el diálogo en el onCreateDialog(), puede implementar onPrepareDialog() para cambiar las opciones antes de que se muestra al usuario. Por ejemplo:

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

También se puede obtener el mismo efecto por conseguir el adaptador desde el diálogo (y se convierte para el tipo correcto) y añadiendo o quitando los artículos como mejor le parezca. Probablemente me inclino por simplemente crear un nuevo adaptador, porque no tendrá que preocuparse por convertir el valor de getListAdapter() al tipo incorrecto. Sin embargo, reutilizar el adaptador probablemente sea un poco más eficiente con la memoria.

+0

ArrayAdapter adapter = new ArrayAdapter (); no puede usarlo de esta manera, no hay un constructor 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); 

    } 
} 

puede utilizar "android.R.layout.select_dialog_item" - diálogo sin botón OK, o "android.R.layout.select_dialog_singlechoice" con el botón OK

2

si está utilizando un constructor, tratar esto:

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

No hay un constructor predeterminado para ArrayAdapter, por lo que debería ser algo así como: ArrayAdapter itensAdapter = new ArrayAdapter (this, R.layout.list); – EtienneSky

Cuestiones relacionadas