Пользовательский ArrayAdapter и Spinner. Нет выбора предметов - PullRequest
3 голосов
/ 03 января 2012

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 не генерируется. Управление счетчиком пустое. Где моя вина?

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

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));
}  
}

layout 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>

Ответы [ 2 ]

4 голосов
/ 03 января 2012

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

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», чтобы расширить свои знания.

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

1 голос
/ 03 января 2012

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

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