2010-09-10 13 views
9

Grüße alle. Ich habe ein kleines Problem ... Nun, lassen Sie mich zuerst sagen, was ich zu erreichen versuche. Ich hatte einen Spinner, der Strings aus einem gespeicherten Array zieht. Wie so, Sie nicht brauchen, es aber zu lesen:Simple Adapter Problem, Text + Bild in Spinner. Java, Android

 
ArrayAdapter healthadapter = ArrayAdapter.createFromResource(
        this, R.array.health, android.R.layout.simple_spinner_item); 

      mHealthSpin = (Spinner) findViewById(R.id.health_spin); 

healthadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

mHealthSpin.setAdapter(healthadapter); 

Einfach und fast ausreichend. Ich möchte dem Spinner ein Bild hinzufügen. Der Radioknopf ist nicht notwendig. Also sollte der Spinner auftauchen und eine Liste haben:

Bis jetzt habe ich einen benutzerdefinierten SimpleAdapter. Hier ist das Problem!: Der Text erscheint, aber nicht das Bild. Heres der code:

Ich plane, eine switch-Anweisung zu verwenden, um verschiedene Bilder für jeden Namen festzulegen. aber ich habe hier aufgehört, bis ich ein Bild zeigen kann.

Wie ich bin

 
    ArrayList> list = new ArrayList>(); 
      HashMap map = new HashMap(); 
      map.put("Name", "One"); 
      map.put("Icon", R.drawable.icon); 
      list.add(map); 

      map = new HashMap(); 
      map.put("Name", "Two"); 
      map.put("Icon", R.drawable.icon); 
      list.add(map); 

      mStageSpin = (Spinner) findViewById(R.id.stage_spin);       
      stageadapter adapter = new stageadapter(getApplicationContext(), list, R.layout.stagerow, new String[] { 
               "Name", "Icon"}, new int[] { 
                R.id.stage_name, R.id.stage_icon }); 
      mStageSpin.setAdapter(adapter);

Die Antwort für mich so zu nennen ist in den Kommentaren

Antwort

13

Entfernen Sie die folgende Zeile ein - seinen verwirrenden Ihren Adapter:

healthadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.main); 

     ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); 
     HashMap<String, Object> map = new HashMap<String, Object>(); 
     map.put("Name", "One"); 
     map.put("Icon", R.drawable.icon); 
     list.add(map); 

     map = new HashMap<String, Object>(); 
     map.put("Name", "Two"); 
     map.put("Icon", R.drawable.icon); 
     list.add(map); 

     Spinner spin = (Spinner) findViewById(R.id.spin); 
     myAdapter adapter = new myAdapter(getApplicationContext(), list, 
       R.layout.list_layout, new String[] { "Name", "Icon" }, 
       new int[] { R.id.name, R.id.icon }); 

     spin.setAdapter(adapter); 

    } 

    private class myAdapter extends SimpleAdapter { 

     public myAdapter(Context context, List<? extends Map<String, ?>> data, 
       int resource, String[] from, int[] to) { 
      super(context, data, resource, from, to); 

     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      if (convertView == null) { 
       convertView = getLayoutInflater().inflate(R.layout.list_layout, 
         null); 
      } 

      HashMap<String, Object> data = (HashMap<String, Object>) getItem(position); 

      ((TextView) convertView.findViewById(R.id.name)) 
        .setText((String) data.get("Name")); 
      ((ImageView) convertView.findViewById(R.id.icon)) 
        .setImageResource(R.drawable.icon); 

      return convertView; 
     } 

    } 
+0

ich entfernte setDropDownViewResource. Kein Bild.Ich habe Ihren Code geändert, um mit mir zu arbeiten. Kein Bild. Ich habe Overide getDropDownView hinzugefügt. Kein Bild :(Ich bin nicht sicher, was falsch ist, weil der Text funktioniert. – Brian

+1

Überprüfen Sie die XML-Definition Ihres Zeilenlayouts. Häufiger Fehler: In einem horizontalen LinearLayout sollten Sie wrap_content für die TextView und die ImageView (nicht fill_parent) –

+0

Das war es! Mein TextView wurde als fill_parent Thanks – Brian

3

Das Problem ist in getView, dem Sie einen Text zugeordnet haben, der po entspricht sition

((TextView) convertView.findViewById(R.id.name)).setText((String) data.get("Name"));

Aber für Bild verwendet haben u die gleiche Ressource dh

((ImageView) convertView.findViewById(R.id.icon)).setImageResource(R.drawable.icon);

Sie müssen die "Daten" hashmap Liste und weisen Sie das Bild hier

1

Ja verwenden verwendet @Vicky du hast Recht. Für Bild sollte es

((ImageView) convertView.findViewById(R.id.icon)) .setBackgroundResource((Integer) data.get("Icon")); 
0

basieren auf der obigen Antwort, aber mit ein paar Veränderungen, den Code zu vereinfachen und es für das Drop-Down-als auch zu arbeiten. Definieren Sie zuerst das XML für das gewünschte Zeilenlayout. In diesem Fall wird ein Textview und ein Bild in Folge:

text_image_spinner_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" > 

<TextView android:id="@+id/text_image_spinner_text_tv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 
<ImageView android:id="@+id/text_image_spinner_image_imageview" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:src="@drawable/icon" /> 
</LinearLayout> 

Dann erzeugen die Klasse, die jede Reihe bauen, wie gebraucht:

TextImageAdapter.java

public class ImageTextAdapter extends SimpleAdapter { 
public final static String keyForTextInAdapter = "text"; 
public final static String keyForImageInAdapter = "image"; 

private final static String fromKeys[]  = {keyForTextInAdapter, keyForImageInAdapter}; 
private final static int toIds[]   = {MyR.id.text_image_spinner_text_tv, MyR.id.text_image_spinner_image_imageview}; 
private final static int TO_ID_TEXT_INDEX = 0; 
private final static int TO_ID_IMAGE_INDEX = 1; 
private final static int layoutId   = MyR.layout.text_image_spinner_layout; 

private final static int TYPE_SHOWN_SELECTION = 0; 
private final static int TYPE_IN_DROPDOWN  = 1; 

LayoutInflater inflater; 
private List<? extends Map<String, ?>> dataIn; 

public ImageTextAdapter(Context context, List<? extends Map<String, ?>> data) { 
    super(context, data, layoutId, fromKeys, toIds); 
    inflater = LayoutInflater.from(context); 
    dataIn = data; 
} 

@Override 
public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    return makeView(position, convertView, parent,TYPE_IN_DROPDOWN); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    return makeView(position, convertView, parent, TYPE_SHOWN_SELECTION); 
} 

private View makeView(int position, View convertView, ViewGroup parent, int type) { 
    // Use the int type if you want to determine different actions if you have 
    // differing requirements for the dropdown and the shown selection. 
    if (convertView == null) convertView = inflater.inflate(layoutId, null); 

    HashMap<String, Object> data = (HashMap<String, Object>)dataIn.get(position); 

    ((TextView) convertView.findViewById(toIds[TO_ID_TEXT_INDEX])).setText((String) data.get(keyForTextInAdapter)); 
    ((ImageView) convertView.findViewById(toIds[TO_ID_IMAGE_INDEX])).setImageBitmap((Bitmap) data.get(keyForImageInAdapter)); 

    return convertView; 
    } 
} 

Und jetzt müssen Sie nur den Spinner Adapter beim Instanziieren erstellen. Sie stellen die "Dinge" ... zur Verfügung:

private void setUpAppOptions() { 
    ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); 
    HashMap<String, Object> map; 

    for (int i=0; i<things.length; i++) { 
     map = new HashMap<String, Object>(); 
     map.put(ImageTextAdapter.keyForTextInAdapter, things[i].name); 
     map.put(ImageTextAdapter.keyForImageInAdapter, things[i].image); 
     list.add(map); 
    } 

    ImageTextAdapter adapter = new ImageTextAdapter(myContext, list); 
    appOptionSpinner.setAdapter(adapter); 
}