Spinner OnItemSelected не работает с настраиваемой компоновкой строк

Я пытаюсь использовать пользовательский макет строки для счетчика следующим образом:

String[] countryArr={"USA","Canada","Other"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.row, R.id.text, countryArr);
spinnerCountry.setAdapter(adapter);

строка.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#fff"
    android:orientation="horizontal"
    android:paddingBottom="10dp"
    android:paddingLeft="20dp"
    android:paddingTop="10dp" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/BLACK"
        android:textSize="26dp" />

    <RadioButton
        android:id="@+id/radio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true" />

</RelativeLayout>

и Java-код:

spinnerCountry.setOnItemSelectedListener(new MyOnItemSelectedListener());

public class MyOnItemSelectedListener implements OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> parent, View view, int pos,
            long id) {
        selected = parent.getItemAtPosition(pos).toString().trim();
        Log.i("MyOnItemSelectedListener","selected ="+selected);

        }
    @SuppressWarnings("rawtypes")
    public void onNothingSelected(AdapterView parent) {
        etCountry.setText("");
    Log.i("MyOnItemSelectedListener","nothing selected");
    }
}

Когда я запускаю приложение, я получаю в журнале: "selected =Other", потому что это значение по умолчанию.

Но когда я нажимаю счетчик, я получаю экран, как показано ниже, и onItemSelected не работает, и, следовательно, это окно предупреждения всегда отображается, позволяя выбрать все 3 значения, но не выполняя никаких действий.

main.xml

<com.Mypackage.MySpinner
                    android:id="@+id/SpinnerCountry1"
                    android:layout_width="45dp"
                    android:layout_height="59dp"
                    android:layout_marginLeft="160dp"
                    android:background="@drawable/selector_slim_spinner"
                    android:clickable="true"
                    android:entries="@array/blankarray" />

public class MySpinner extends Spinner {

    private Context _context;

    public MySpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
        _context = context;
    }

    public MySpinner(Context context) {
        super(context);
        _context = context;
    }

    public MySpinner(Context context, AttributeSet attrs, int defStyle) {
        super(context);
        _context = context;
    }

    @Override
    public View getChildAt(int index) {
        View v = new View(_context);
        return v;
    }

}

Обратите внимание, что если я не использую настраиваемый макет строки для счетчика, OnItemSelected работает нормально.

Любая помощь приветствуется.

скриншот


person GAMA    schedule 19.03.2013    source источник
comment
почему вы публикуете вопрос второй раз?   -  person Hardik Joshi    schedule 19.03.2013
comment
Я удалил это, так как это было не совсем ясно и не очень хорошо отформатировано.   -  person GAMA    schedule 19.03.2013
comment
Почему вы используете Radio Button в счетчике? Spinner выбирает один вариант за раз, вам не нужен переключатель. Вы можете выбрать только один элемент из Spinner, когда используете Spinner.   -  person Sulabh Gajjar    schedule 19.03.2013
comment
Я знаю это. Но это одно из требований к дизайну.   -  person GAMA    schedule 19.03.2013
comment
@GAMA Вы нашли решение? Я также застрял с той же проблемой.   -  person Ali_Waris    schedule 14.11.2017


Ответы (3)


Измените файл row.xml на

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#fff"
    android:orientation="horizontal"
    android:paddingBottom="10dp"
    android:paddingLeft="20dp"
    android:paddingTop="10dp" >

<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@color/BLACK"
    android:textSize="26dp"
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false" />

<RadioButton
    android:id="@+id/radio"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true" 
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"/>

</RelativeLayout>

и попытаться

person almuneef    schedule 19.03.2013
comment
Таким образом, установите все элементы в пользовательском макете как clickable="false". Это работает удовольствие! - person nderjung; 30.07.2014

Вы пытались установить прослушиватель на свой RadioButton с помощью пользовательского ArrayAdapter?

person Damien R.    schedule 19.03.2013
comment
ты имеешь в виду setOnCheckedChangeListener? - person GAMA; 19.03.2013
comment
Я думаю, что setOnClickListener было бы лучше, так как ваши радиокнопки не находятся в радиогруппе, я не уверен, что setOnCheckedChangeListener сработает, но вы можете попробовать. В пользовательском адаптере массива что-то вроде view.findViewById(R.id.radio); - person Damien R.; 19.03.2013

Я думаю, это могло бы сделать работу

После того, как вы инициализировали счетчик на вашем onCreate.

yourspinner.setOnItemSelectedListener(this);
person nDCasT    schedule 05.04.2016