Заполнить Spinner БЕЗ файла Strings.xml

Итак, все, что я нашел, это использование файла strings.xml для заполнения счетчика. Что я хочу сделать, так это заполнить счетчик на основе информации, которую я получаю из ответа JSON. У меня есть следующий код, который я использовал для заполнения таблицы, но изменил его для этого. Однако мой счетчик по-прежнему пуст, и я не получаю никаких ошибок, кроме D/ViewRootImpl: #3 mView = null

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

public class SecondFragment extends Fragment implements APIRequestsUtil.APIRequestResponseListener
{
    View myView;
    Map<String, Route> drives;
    private ArrayAdapter<Integer> adapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myView = inflater.inflate(R.layout.second_layout, container, false);
        APIRequestsUtil.setOnNetWorkListener(this);
        return myView;
    }

    private void populateView() {
        this.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                drives = APIRequestsUtil.getRoutes();

                Spinner spinner = (Spinner) myView.findViewById(R.id.spinner);
                int driveNum = 0;
                for (Map.Entry drive : drives.entrySet()) {
                    TableRow tr = new TableRow(getActivity());
                    Route route = (Route) drive.getValue();
                    tr.setId(driveNum++);
                    //tr.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));



                    spinner.setId(driveNum);

                }
            }
        });

    }

    //@Override
    public void onFailure(Request request, Throwable throwable) {

    }

    //@Override
    public void onResponse(Response response) {
        populateView();
    }
}

Вот мой XML:

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

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:id="@+id/spinner"/>
</RelativeLayout>

person James Robert Singleton    schedule 03.09.2016    source источник


Ответы (1)


Итак, все, что я нашел, это использование файла strings.xml для заполнения счетчика.

Вот пример приложения, которое демонстрирует заполнение Spinner содержимым массива Java.

В документации используется ресурс массива для заполнения Spinner, но вы можете заменить некоторые другие ArrayAdapter на тот, который их пример кода создает с использованием createFromResource().

Вот код для заполнения счетчика

Там нет кода, который заполняет Spinner. Вы извлекаете Spinner из своего макета. Затем вы вызываете setId() в цикле, я не совсем понимаю, почему. У вас есть ArrayAdapter с именем adapter, который обещает, но вы никогда его не настраивали.

Вот действие из примера приложения, на которое я ссылался выше:

/***
  Copyright (c) 2008-2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain   a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    https://commonsware.com/Android
*/

package com.commonsware.android.selection;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class SpinnerDemo extends Activity
  implements AdapterView.OnItemSelectedListener {
  private TextView selection;
  private static final String[] items={"lorem", "ipsum", "dolor",
          "sit", "amet",
          "consectetuer", "adipiscing", "elit", "morbi", "vel",
          "ligula", "vitae", "arcu", "aliquet", "mollis",
          "etiam", "vel", "erat", "placerat", "ante",
          "porttitor", "sodales", "pellentesque", "augue", "purus"};

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    selection=(TextView)findViewById(R.id.selection);

    Spinner spin=(Spinner)findViewById(R.id.spinner);
    spin.setOnItemSelectedListener(this);

    ArrayAdapter<String> aa=new ArrayAdapter<String>(this,
                              android.R.layout.simple_spinner_item,
                              items);

    aa.setDropDownViewResource(
      android.R.layout.simple_spinner_dropdown_item);
    spin.setAdapter(aa);
  }

  @Override
  public void onItemSelected(AdapterView<?> parent,
                                View v, int position, long id) {
    selection.setText(items[position]);
  }

  @Override
  public void onNothingSelected(AdapterView<?> parent) {
    selection.setText("");
  }
}

Он следует тому же рецепту, что и в документации. Я использую конструктор для создания экземпляра ArrayAdapter, оборачивая его вокруг String[], который является данными моей модели. Неясно, что вы хотите иметь в своем Spinner, но вы можете иметь ArrayAdapter<Integer> (как показано в вашем коде) или ArrayAdapter<Route> или что-то еще.

Более сложные сценарии ищите в ListView примерах. Spinner работает почти так же, только с двумя существенными изменениями:

  • Вам необходимо предоставить два ресурса макета (см. setDropDownViewResource() в приведенном выше коде). И если вы переопределяете getView() в пользовательском подклассе ArrayAdapter, возможно, вам также потребуется переопределить getDropDownView().

  • Spinner запускает события выбора, а не события щелчка по элементу

person CommonsWare    schedule 03.09.2016
comment
Я бы использовал список, но мне нужен раскрывающийся список, потому что использование списка было бы слишком много на странице. - person James Robert Singleton; 03.09.2016
comment
@JamesRobertSingleton: Все в порядке. Я хочу сказать, что Spinner работает так же, как ListView. ListView также значительно популярнее. Итак, если вам трудно найти пример выполнения чего-либо с Spinner, найдите пример того же действия с ListView, и он должен дать вам подсказки о том, как реализовать это с вашим Spinner. - person CommonsWare; 03.09.2016
comment
в этом примере есть private static final String[] items={lorem, ipsum, dolor и т. д. и т. д.}. Однако я не хочу устанавливать эти значения. - person James Robert Singleton; 03.09.2016
comment
@JamesRobertSingleton: Затем придумайте свои собственные значения и используйте любой конструктор ArrayAdapter, который вы хотите использовать. - person CommonsWare; 03.09.2016