2011-03-24 15 views
47

¿Es esta la forma correcta de implementar el par clave-valor para un Spinner en Android?¿Cuál es la forma correcta de implementar pares clave-valor en 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; 
    } 
} 
+0

que he necesitado esto también y crear una biblioteca simple que hace exactamente eso - Spinner con claves y valores: https://github.com/delight-im/Android- KeyValueSpinner – caw

Respuesta

6

esta es una forma. lo uso bastante aunque utilizo mi propio adaptador (que hereda de BaseAdpater). Otra forma sería como la de arriba para tener un índice (0,1,2, etc.) mappd a un valor y cuando obtienes un elemento obtienes su índice un pozo para que puedas recuperar su valor desde el mapa. me gusta que la opción menos ...

+2

¿Podría proporcionar más detalles sobre por qué funciona lo anterior? Establece una estructura de datos personalizada con un nombre y valor y la pasa al adaptador SPinner ... pero ¿por qué el adaptador muestra el valor? –

2

Crear un mapa de valores clave, y toma un valor en onItemSelected (se puede obtener "clave" a través de spinner.getAdapter(). GetItem (posición)).

3

para evitar llegar de nuevo en items[] del oyente utilizar getItemAtPosition que devuelve un objeto del adaptador. Para acceder a los métodos MyData debe convertir el objeto de esta manera:

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

creé un HashMap adapter para su uso en estos escenarios. Véase también el ejemplo de proyecto here

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

podría decirme cómo buscar la clave seleccionada y el valor – Rahul

+0

https://github.com/ayvazj/hashadapter-android/blob/master/app/src/main/java/com/github/ayvazj/hashadapter/sample/ MainActivity.java # L130 – ayvazj

Cuestiones relacionadas