Пользовательский ArrayAdapter и Spinner. Нет выбора товара

Android 1.6 Есть коллекция таких объектов

public class MyItem {
public String name = "";
public String brief = "";
     public int availiableweight = 0; 
public Node xmlpoint = null;

@Override
public String toString()
{
    return name;
}
public MyItem(String _brief, String _name, Node _xmlpoint)
{
    name = _name;
    brief = _brief;
    xmlpoint = _xmlpoint;
}
 }

Объекты хранились в массиве: ArrayList itemsList

Элементы отображаются в раскрывающемся списке счетчика, но я не могу выбрать ни один элемент. Событие OnItemSelectedListener не создается. Элемент управления Spinner пуст. Где моя вина?

Код приложения

public class MyActivity extends Activity {
/** Called when the activity is first created. */

private ArrayList<MyItem> itemsList;
private Spinner mySpinner;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mySpinner = (Spinner) findViewById(R.id.mySpinner);

    itemsList = new ArrayList<MyItem>();
    ArrayAdapter<MyItem> myAdapter = new ArrayAdapter<MyItem>(this, android.R.layout.simple_spinner_item, itemsList); 
    myAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    mySpinner.setAdapter(myAdapter); 

    mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() 
    {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) 
        {
            // TODO Auto-generated method stub
            AlertDialog("Pos: " + arg2);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) 
        {
            // TODO Auto-generated method stub
        }
    });
    itemsList.add(new MyItem("1","one",null));
    itemsList.add(new MyItem("2","two",null));
    itemsList.add(new MyItem("3","three",null));
}  
}

макет main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<LinearLayout
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/languageText"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:text="Language" android:gravity="center_vertical"/>

    <Spinner
        android:id="@+id/languageSpinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" android:prompt="@string/chooseitem"/>

</LinearLayout>

</LinearLayout>

person Foxbox    schedule 03.01.2012    source источник


Ответы (2)


Ваша проблема здесь:

ArrayAdapter<MyItem> myAdapter = new ArrayAdapter<MyItem>(this, android.R.layout.simple_spinner_item, itemsList);

Вы не можете использовать универсальный класс ArrayAdapter, так как у вас есть массив пользовательских объектов. В конструкторе для ArrayAdapter вы используете файл макета android.R.layout.simple_spinner_item. но адаптер не знает, как отображать ваши данные.

Вы должны использовать пользовательский адаптер и создать свой собственный файл макета XML. Прочтите несколько примеров о том, как этого добиться. Лучше всего понять, как работают ListViews и адаптеры.

См. эти ссылки:

http://android.vexedlogic.com/2011/04/02/android-lists-listactivity-and-listview-i-basic-usage/

http://android.vexedlogic.com/2011/04/02/android-lists-listactivity-and-listview-ii-%E2%80%93-custom-adapter-and-list-item-view/

Они дают очень хорошую ссылку. Вы можете продолжить чтение следующих частей серии руководств «Списки Android», чтобы расширить свои знания.

Надеюсь это поможет. Если вам нужны дополнительные объяснения, обязательно оставьте комментарий.

person Bandreid    schedule 03.01.2012

спасибо Bandreid за ответ, но решение было другим. Не используйте ArrayList напрямую, только через адаптер. Этот код правильный

myAdapter.add(new MyItem("1","one",null));     
myAdapter.add(new MyItem("2","two",null));     
myAdapter.add(new MyItem("3","three",null)); 
person FoxBox    schedule 03.01.2012