2011-10-18 18 views
11

Ho guardato Android AlertDialog, ed è abbastanza facile usare setItems (...) per aggiungere un elenco di stringhe che devono essere mostrate.Oggetti personalizzati nella lista AlertDialog; come ottenere una stringa di visualizzazione e quindi il valore effettivo?

Tuttavia, nella maggior parte dei casi si desidera visualizzare un elenco di stringhe piacevoli, ma quando si seleziona qualcosa dall'elenco si desidera il valore effettivo e non la stringa.

Non sono riuscito a trovare come farlo in modo facile e piacevole.

Suggerimenti? =)

final Button Button1 = (Button) findViewById(R.id.Button1); 
Button1.setOnClickListener(new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     final CharSequence[] items = { "String 1", "String 2", "String 3" }; 
     // INstead of a string array, I want something like: 
     // ArrayList<CustomObject> test = new ArrayList<CustomObject>(myArray); 
     // And the CustomObject has a toString() and also a value. This array should in the best of worlds be the base for the list below =) 

     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
     builder.setTitle(LanguageHandler.GetString("Test")); 
     builder.setItems(items, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 

       // *** I want to get the value here! *** 

       Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
}); 
+0

si può eloborate di più? ciò che vuoi? – user370305

+0

Ehi, scusa. Non ho visto questo commento fino ad ora. Bene, penso che sia chiaro sul commento sopra (il commento nel codice che è). Voglio che gli oggetti personalizzati vengano aggiunti a AlertDialog, dove gli oggetti toString() devono essere stampati, ma quando clicco vorrei ottenere l'oggetto cliccato da restituire invece ... =) – Ted

+0

Guarda la mia risposta, Spero che tu ottenga ciò che desideri .. Crea semplicemente un adattatore personalizzato dei tuoi oggetti e impostalo su AlertDialog. – user370305

risposta

38

Invece di CharSequence[] items = { "String 1", "String 2", "String 3" }; è possibile utilizzare un Custom Adapter nella vostra finestra di avviso,

Qualcosa di simile,

AlertDialog.Builder builder = new AlertDialog.Builder(MyApp.this); 
      builder.setTitle("Select"); 
      builder.setAdapter(adapter, 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, 
           int item) { 
          Toast.makeText(MyApp.this, "You selected: " + items[item],Toast.LENGTH_LONG).show(); 
          dialog.dismiss(); 
         } 
        }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 

tuo list_row.xml file di

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="48px" 
     android:layout_height="48px" 
     android:layout_gravity="left" /> 

    <TextView 
     android:id="@+id/title" 
     android:textColor="#0000FF" 
     android:text="" 
     android:paddingLeft="10dip" 
     android:layout_gravity="center" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

E il tuo ListAdapter qualcosa di simile,

String[] items = {"airplanes", "animals", "cars", "colors", "flowers", "letters", "monsters", "numbers", "shapes", "smileys", "sports", "stars" }; 

// Instead of String[] items, Here you can also use ArrayList for your custom object.. 

ListAdapter adapter = new ArrayAdapter<String>(
     getApplicationContext(), R.layout.list_row, items) { 

    ViewHolder holder; 
    Drawable icon; 

    class ViewHolder { 
     ImageView icon; 
     TextView title; 
    } 

    public View getView(int position, View convertView, 
      ViewGroup parent) { 
     final LayoutInflater inflater = (LayoutInflater) getApplicationContext() 
       .getSystemService(
         Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 
      convertView = inflater.inflate(
        R.layout.list_row, null); 

      holder = new ViewHolder(); 
      holder.icon = (ImageView) convertView 
        .findViewById(R.id.icon); 
      holder.title = (TextView) convertView 
        .findViewById(R.id.title); 
      convertView.setTag(holder); 
     } else { 
      // view already defined, retrieve view holder 
      holder = (ViewHolder) convertView.getTag(); 
     }  

     Drawable drawable = getResources().getDrawable(R.drawable.list_icon); //this is an image from the drawables folder 

     holder.title.setText(items[position]); 
     holder.icon.setImageDrawable(drawable); 

     return convertView; 
    } 
}; 
+0

Questo mi ha aiutato molto! Bello! – Jesse

+0

Qual è l'oggetto 'tile' qui? – Ahmed

+0

@JaVAndroid - Oh scusa ..! 'tile' era drawable. Ho aggiornato la risposta. – user370305

Problemi correlati