2010-09-10 17 views
9

Saludos a todos. Tengo un pequeño problema ... Bueno, déjenme decir primero lo que estoy tratando de lograr. Tuve un spinner que extrae cadenas de una matriz almacenada. Como tal, usted no necesita leerlo sin embargo:Problema del adaptador simple, texto + imagen en 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); 

simple y casi suficiente. Me gustaría agregar una imagen al girador ... el botón de radio no es necesario. Así que la ruleta debería aparecer y tener una lista:

 
TEXT  *IMAGE* 
TEXT2 *IMAGE* 
TEXT3 *IMAGE* 

Hasta ahora tengo un Adaptador Simple personalizado. ¡Aquí está el problema!: aparece el texto pero no la imagen. Aquí está el código:

 
public class stageadapter extends SimpleAdapter { 

private Context localContext; 
private ArrayList> localList; 

public stageadapter(Context context, 
    ArrayList> list, int resource, 
    String[] from, int[] to) { 
super(context, list, resource, from, to); 
localContext = context; 
localList = list; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
if (null == convertView) { 
    LayoutInflater inflater = (LayoutInflater) localContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.stagerow, null); 
} 
TextView name = (TextView) convertView.findViewById(R.id.stage_name); 
name.setText((String)localList.get(position).get("Name")); 
ImageView icon = (ImageView) convertView.findViewById(R.id.stage_icon); 

icon.setImageResource(R.drawable.icon); 

return convertView; 
} 
@Override 
public View getDropDownView(int position, View convertView, 
      ViewGroup parent) { 
if (null == convertView) { 
    LayoutInflater inflater = (LayoutInflater) localContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.stagerow, null); 
} 
TextView name = (TextView) convertView.findViewById(R.id.stage_name); 
name.setText((String)localList.get(position).get("Name")); 
ImageView icon = (ImageView) convertView.findViewById(R.id.stage_icon); 
icon.setImageResource(R.drawable.icon); 

return convertView; 
} 
} 

Planeo usar una declaración de interruptor para establecer diferentes imágenes para cada nombre. Sin embargo, me detuve aquí hasta que pueda obtener cualquier imagen para mostrar.

cómo estoy llamando

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

La respuesta para mí es en los comentarios

Respuesta

13

Retire la siguiente línea - su confundiendo su adaptador:

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

eliminé setDropDownViewResource. Sin imágen.Modifiqué tu código para trabajar con el mío. Sin imágen. Agregué Overide getDropDownView. Sin imagen :(No estoy seguro de qué está mal porque el texto funciona. – Brian

+1

Comprueba la definición xml del diseño de tu fila. Error común: en LinearLayout horizontal, debes usar wrap_content para TextView y ImageView (no fill_parent) –

+0

Eso fue Mi TextView se estableció como fill_parent Gracias – Brian

3

El problema está en getView has asignado el texto correspondiente a po sición usando

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

Pero para una imagen u han utilizado el mismo recurso es decir

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

Es necesario utilizar los "datos" lista HashMap y asignar la imagen aquí

1

Sí @Vicky, tienes razón. Para la imagen que debería ser

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

Con base en la respuesta anterior, pero con algunos retoques para simplificar el código y hacer que funcione para el menú desplegable también. Primero defina el xml para el diseño de fila que desea. En este caso, un TextView y una imagen consecutivas:

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> 

A continuación, crear la clase que va a construir cada fila según sea necesario:

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

Y ahora solo necesita construir el adaptador giratorio al crear una instancia. Usted proporciona las "cosas" ...:

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