Android Spinner получает выбранное значение OnSelectedItemListener();

У меня проблема с выбором значения для счетчика. вот мой код и адаптер.

Слушатель событий Spinner

category = (Spinner) findViewById(R.id.Spinner);
category.setPrompt("Select Category..");
ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();                                     
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("Category", "Choose a Category");
list.add(map);

map = new HashMap<String, Object>();
map.put("Icon", R.drawable.icon1);
map.put("Category", "Category1");
list.add(map);

map = new HashMap<String, Object>();
map.put("Icon", R.drawable.icon2);  
map.put("Category", "Category2");                                                                       
list.add(map);

map = new HashMap<String,Object>();
map.put("Icon", R.drawable.icon3);
map.put("Category", "Category3");                                                                               
list.add(map);
CategoryAdapter adapter = new CategoryAdapter(v.getContext(), list,R.layout.list_layout, new String[] { "Category", "Icon" }, new int[] { R.id.category, R.id.icon });
category.setAdapter(adapter);   

category.setOnItemSelectedListener(new OnItemSelectedListener(){

@Override
public void onItemSelected(AdapterView<?> arg0,View v, int arg2,long arg3) {
    // TODO Auto-generated method stub
    String selected = category.getSelectedItem().toString();
    //String selected = category.getTag().toString();
    try{
        //String selected = category.getSelectedItem().toString();
        //Object selected = arg0.getTag();
        //Toast.makeText(getApplicationContext(), String.valueOf(selected), Toast.LENGTH_SHORT).show();
        if(selected.toString().equals("Category1")){
            String msg1 = "Category1 type selected";
            Toast.makeText(getApplicationContext(), msg1 + " " + selected, Toast.LENGTH_SHORT).show();
        }else if(selected.toString().equals("Category2")){
            String msg2 = "Category2 type selected";
            Toast.makeText(getApplicationContext(), msg2 +  " " + selected, Toast.LENGTH_SHORT).show();
        }else if(selected.toString().equals("Category3")){
            String msg3 = "Category3 type selected";
            Toast.makeText(getApplicationContext(), msg3 + " " + selected, Toast.LENGTH_SHORT).show();
        }
    }catch(Exception e){
        Toast.makeText(getApplicationContext(),"Error occured " + e.getName().getClass(), Toast.LENGTH_SHORT).show();
    }                                                                                               
}

@Override
public void onNothingSelected(
        AdapterView<?> arg0) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(), "nothing selected", Toast.LENGTH_SHORT).show();
}

});

КатегорияАдаптер

public class ReminderCategoryAdapter extends SimpleAdapter{

    Context c;

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

    }

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

        if (convertView == null) {
            LayoutInflater li = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = li.inflate(R.layout.list_layout,null);
        }

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

        ((TextView) convertView.findViewById(R.id.category)).setText((String) data.get("Category"));
        ((TextView) convertView.findViewById(R.id.category)).setTag((Object) data.get("Category"));

        return convertView;
    }
}

для моего спиннера, в адаптере, я надуваю изображение + текст, мой спиннер работает найти, при этом я иллюстрирую свой спиннер

============================

|Значок1 Текст1 |

|Значок2 Текст2 |

|Значок3 Текст3 |

но как только я попытаюсь использовать onitemselectedlistener и использовать метод getSelectedItem().toString() и поджарить его, значение, возвращаемое всплывающим уведомлением, представляет собой комбинацию значка и текста, я не хочу, чтобы значение значка было возвращено, но Мне просто нужна только строка или текст. Я пытаюсь использовать метод setTag (значение объекта), используя ((TextView) convertView.findViewById (R.id.category)).setTag((Object) data.get("Category")); в адаптере, а при использовании метода getTag() в прослушивателе возникало исключение нулевого указателя. Вместо использования метода getItemPosition(position) или getSelectedItem() существует ли какое-либо другое решение для получения и управления строковым значением для выбранного элемента? Пожалуйста помоги.


person Zahary    schedule 03.11.2011    source источник


Ответы (1)


Одним из решений, которое вы можете легко использовать, является использование метода Spinner#getSelectedItemPosition(). Этот метод вернет позицию выбранного элемента, и вы сможете получить сам элемент из списка, который вы передаете адаптеру.

Итак, замените следующую строку в вашем методе onItemSelected:

String selected = category.getSelectedItem().toString();

с:

String selected = list.get(category.getSelectedItemItemPosition()).get("Category");
person svpino    schedule 03.11.2011
comment
Просто чтобы объяснить это немного больше, category.getSelectedItem() возвращает экземпляр карты. Вот почему выполнение toString() не работает. Если вы сделаете category.getSelectedItem().get("Category"), вы получите значение для этого ключа на карте. - person dmon; 03.11.2011