Как правильно реализовать пару ключ-значение в Spinner в Android - PullRequest
47 голосов
/ 24 марта 2011

Это правильный способ реализации пары ключ-значение для Spinner в 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;
    }
}

Ответы [ 4 ]

6 голосов
/ 25 марта 2011

это один из способов. Я использую его довольно часто, хотя я использую свой собственный адаптер (унаследованный от BaseAdpater). Другим способом было бы, как и выше, иметь индекс (0,1,2 и т. Д.), Сопоставляемый со значением, и когда вы получаете элемент, вы получаете его индекс, так что вы можете получить его значение из карты. Мне нравится этот вариант меньше ...

5 голосов
/ 19 сентября 2015

Я создал адаптер HashMap для использования в этих сценариях. Также см. Пример проекта здесь

    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);
3 голосов
/ 29 июня 2014

Чтобы избежать возврата в items[] от слушателя, используйте getItemAtPosition, который возвращает объект из адаптера.Чтобы получить доступ к MyData методам, вы должны привести объект следующим образом:

public void onItemSelected(
        AdapterView<?> parent, View view, int position, long id) {
    MyData d = (MyData) parent.getItemAtPosition(position);
    valueTextView.setText( d.getValue() );
}
2 голосов
/ 24 марта 2011

Создайте карту значений ключей и примите значение в onItemSelected (вы можете получить «ключ» через spinner.getAdapter (). GetItem (position)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...