¿Cuál es la forma correcta de implementar el par clave-valor en Spinner en android

¿Es esta la forma correcta de implementar el par clave-valor para un Spinner en Android?

package com.mypackage import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Spinner; import android.widget.ArrayAdapter; import android.widget.AdapterView; import android.widget.TextView; public class SpinnerAndAdapter extends Activity { TextView valueTextView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); valueTextView = (TextView)findViewById( R.id.selected ); Spinner s = (Spinner)findViewById(R.id.spinner); final MyData items[] = new MyData[3]; items[0] = new MyData( "key1","value1" ); items[1] = new MyData( "key2","value2" ); items[2] = new MyData( "key3","value3" ); ArrayAdapter<MyData> adapter = new ArrayAdapter<MyData>( this, android.R.layout.simple_spinner_item, items ); adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); s.setAdapter(adapter); s.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { public void onItemSelected( AdapterView<?> parent, View view, int position, long id) { MyData d = items[position]; valueTextView.setText( d.getValue() ); } public void onNothingSelected(AdapterView<?> parent) { } } ); } class MyData { public MyData( String spinnerText, String value ) { this.spinnerText = spinnerText; this.value = value; } public String getSpinnerText() { return spinnerText; } public String getValue() { return value; } public String toString() { return spinnerText; } String spinnerText; String value; } } 

Esta es una forma. Lo uso bastante aunque uso mi propio adaptador (que hereda de BaseAdpater). Otra forma sería b como el anterior para tener un índice (0,1,2, etc) mappd a un valor y cuando se obtiene un elemento obtener su índice de un pozo por lo que puede recuperar su valor para el mapa mthe. Me gusta esa opción menos …

He creado un adaptador HashMap para su uso en estos escenarios. Ver también proyecto de ejemplo aquí

  mapData = new LinkedHashMap<String, String>(); mapData.put("shamu", "Nexus 6"); mapData.put("fugu", "Nexus Player"); mapData.put("volantisg", "Nexus 9 (LTE)"); mapData.put("volantis", "Nexus 9 (Wi-Fi)"); mapData.put("hammerhead", "Nexus 5 (GSM/LTE)"); mapData.put("razor", "Nexus 7 [2013] (Wi-Fi)"); mapData.put("razorg", "Nexus 7 [2013] (Mobile)"); mapData.put("mantaray", "Nexus 10"); mapData.put("occam", "Nexus 4"); mapData.put("nakasi", "Nexus 7 (Wi-Fi)"); mapData.put("nakasig", "Nexus 7 (Mobile)"); mapData.put("tungsten", "Nexus Q"); adapter = new LinkedHashMapAdapter<String, String>(this, android.R.layout.simple_spinner_item, mapData); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner = (Spinner) findViewById(R.id.spinner); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(this); 

Para evitar volver a los items[] del oyente use getItemAtPosition que devuelve un objeto del adaptador. Para acceder a los métodos MyData , debe lanzar el objeto de la siguiente manera:

 public void onItemSelected( AdapterView<?> parent, View view, int position, long id) { MyData d = (MyData) parent.getItemAtPosition(position); valueTextView.setText( d.getValue() ); } 

Cree un mapa de valores-clave y tome un valor en onItemSelected (puede obtener "clave" a través de spinner.getAdapter (). GetItem (posición)).

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.