Android Spinner не запустит OnItemSelected, и текущий выбранный элемент не отображается в Spinner

Вот простой GIF-файл приложения в действии, чтобы показать, что я имею в виду: видео-Gif здесь

У меня есть Spinner, и вот мой XML-код для него:

<Spinner
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/uniSpinner"
    android:layout_weight="1.5"
    android:spinnerMode="dialog"
    android:prompt="@string/type_default"/>

Я выполнил несколько руководств и просмотрел здесь, чтобы динамически добавлять контент в счетчик с помощью parse.com. Содержимое успешно добавлено, но OnItemSelected не срабатывает при выборе элемента в списке, выбранный элемент также не отображается в счетчике.

Код выше oncreate:

Spinner uniSpinner;
List<String> uniList;

Код в oncreate:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    // Get the view from main.xml
    setContentView(R.layout.activity_register);

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

    uniList = new ArrayList<String>();

    addItemsToSpinner();
    InitialSetUpUI();

Код для создания счетчика:

public void addItemsToSpinner()
{
    ParseQuery<ParseObject> query = ParseQuery.getQuery("University");

    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> objects, ParseException e) {
            if (e == null)
            {
                for(ParseObject university : objects){
                    uniList.add(university.getString("name"));
                }
            }
            else
            {

            }
        }
    });
}

public void InitialSetUpUI()
{
    Spinner spinner1 = (Spinner) findViewById(R.id.uniSpinner);

    ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item,uniList);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner1.setAdapter(adapter);

    spinner1.setOnItemSelectedListener(new mySpinnerListener());
}

class mySpinnerListener implements Spinner.OnItemSelectedListener
{
    @Override
    public void onItemSelected(AdapterView parent, View v, int position,long id) {
        // TODO Auto-generated method stub
        Toast.makeText(parent.getContext(), "test: " +
                parent.getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView parent) {
        // TODO Auto-generated method stub
        // Do nothing.
    }

}

Понятия не имею, что не так, пробовал много разных руководств и способов создания одного и того же. Ничего не сработало, может быть, я упускаю что-то простое, я не уверен! Если бы кто-нибудь мог помочь, было бы здорово :)


person vmetelz    schedule 05.04.2015    source источник
comment
Почему вы создаете две ссылки для одного и того же Spinner с именами «uniSpinner» и «spinner1»? Я попробовал ваш код, он отлично работает для меня.   -  person    schedule 05.04.2015
comment
Я заметил, что в вашем методе done() вы не вызываете notifyDataSetChanged() на адаптере. Я видел странные вещи, когда ListView не синхронизировался с адаптером с помощью notifyDataSetChanged(). Я бы попробовал переписать код, чтобы к адаптеру можно было получить доступ из метода обратного вызова done(), а notifyDataSetChanged() можно было вызвать в конце метода done().   -  person kris larson    schedule 05.04.2015
comment
@UsmanAliButt это было потому, что я тестировал какой-то другой код и забыл удалить предыдущую ссылку. Могу я спросить, какой эмулятор вы использовали для тестирования? Может быть возможной причиной   -  person vmetelz    schedule 05.04.2015
comment
Я тестировал его на устройстве Nexus 5 (не на эмуляторе)   -  person    schedule 05.04.2015
comment
@krislarson, не могли бы вы привести пример этого? Я пока не силен во всех этих вещах, лол   -  person vmetelz    schedule 05.04.2015
comment
Я просто удалил «spinner1» и использовал «uniSpinner» в вашем коде, и все заработало нормально. Даже без этого было нормально.   -  person    schedule 05.04.2015
comment
просто попробуйте и посмотрите, есть ли какая-то другая проблема   -  person    schedule 05.04.2015
comment
@UsmanAliButt Я сделал это и попробовал на своем устройстве Note 3, результат все тот же, что и на картинке. Я столкнулся с этим, когда открывал действие, содержащее счетчик E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring... Это как-то связано с этим?   -  person vmetelz    schedule 05.04.2015
comment
Попробуйте свой код без свойства счетчика "android:prompt" или увеличив minSdkVersion в manifest.xml, или может возникнуть проблема, если вы используете тему Holo для своего приложения.   -  person    schedule 05.04.2015
comment
@UsmanAliButt Я пробовал это раньше, и это не помогло, я немного сузил его. Когда я вручную создал ArrayList и применил его к новому счетчику, он сработал, как только я скопирую uniList ArrayList, который я создал с помощью Parse, он перестанет работать.   -  person vmetelz    schedule 05.04.2015
comment
Отладьте свой метод addItemsToSpinner(), если ваш счетчик заполнен правильными значениями и вы установили правильные слушатели, тогда он должен работать. Прямо сейчас я могу только строить догадки, потому что я не могу воссоздать проблему для себя, так что попробуйте, попробуйте еще раз :)   -  person    schedule 05.04.2015
comment
@UsmanAliButt Наконец-то разобрался с проблемой, это было связано с тем, как вы получаете данные массива из синтаксического анализа. Я последовал примеру, и это оказалось неверным путем. Я предполагаю, что, поскольку я использую адаптер, мне нужно запросить синтаксический анализ с помощью ParseQueryAdapter? Без понятия, лол. Спасибо за вашу помощь!   -  person vmetelz    schedule 05.04.2015


Ответы (1)


Наконец наткнулся на это, что помогло мне, я изменил свою функцию InitialSetupUI на это:

public void uniSpinnerSetup()
{
    ParseQueryAdapter.QueryFactory<ParseObject> factory = new ParseQueryAdapter.QueryFactory<ParseObject>() {
        public ParseQuery create() {
            ParseQuery query = new ParseQuery("University");
            return query;
        }
    };

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

    ParseQueryAdapter<ParseObject> adapter = new ParseQueryAdapter<ParseObject>(this, factory);
    adapter.setTextKey("name");
    uniSpinner.setAdapter(adapter);
    uniSpinner.setSelection(1);
    uniSpinner.setOnItemSelectedListener(new mySpinnerListener());
}

Не спрашивайте меня, как это работает, лол, но это работает... теперь мне нужно выяснить, как получить эти значения O.o

person vmetelz    schedule 05.04.2015