Установка вращающегося элемента, выбранного JSON - PullRequest
0 голосов
/ 29 января 2019

Я делаю приложение для Android, которое просит пользователей выбрать страну и город с помощью счетчика.

Сначала я получаю данные из json, например:

String state = json.data.getState();

String city = json.data.getCity();

Когдапользователь открывает приложение в первый раз, значение счетчика - это состояние строки и город строки, вот мой код:

 final List<State> statesList = new ArrayList<>();
 final List<String> states = new ArrayList<>();

 final StateAdapter stateAdapter = new StateAdapter(this,
            R.layout.state_list, R.id.spinnerText, statesList);
 SpinnerCity.setAdapter(stateAdapter);
 SpinnerCity.setSelect(String state); //????
 SpinnerCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
     State cityDetails = stateAdapter.getItem(position);
     List<String> cityList = cityDetails.getCities();
     ArrayAdapter citiesAdapter = new ArrayAdapter<>(this,
                    R.layout.city_list, R.id.citySpinnerText, cityList);
     SpinnerArea.setAdapter(citiesAdapter);
     SpinnerArea.setSelected(String city); //??? 
    }

class StateAdapter extends ArrayAdapter<State> {

 private List<State> stateList = new ArrayList<>();

 public StateAdapter(@NonNull Context context, int resource, int spinnerText, @NonNull List<State> stateList) {
    super(context, resource, spinnerText, stateList);
    this.stateList = stateList;
 }
 @Override
 public State getItem(int position) {
     return stateList.get(position);
 }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull 
    ViewGroup parent) {
        return initView(position);
    }
    @Override
    public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    return initView(position);
    } 

    private View initView(int position) {
    State state = getItem(position);
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.state_list, null);
    TextView textView =  view.findViewById(R.id.spinnerText);
    textView.setText(state.getStateName());
    return view;
    }

Я просто не знаю, как сначала поместить строку в Spinner?Кстати, пользователь также может изменять штат и город с помощью счетчика, я буду сохранять информацию об изменении в объект. Спасибо.

[Редактировать] Я знаю, как установить выбор, например:

    int position = stateAdapter.getPosition(statesList.get(3));
    stateSpinner.setSelection(position); 

если я получу данные json - String, как мне узнать StatesList.get (?)

Странно?Когда я получаю строку «Kaohsuing», я пытаюсь найти позицию в ArrayList, но я всегда получаю -1, что означает, что String не соответствует данным Arraylist.

Моя ошибка, если я хочу найти позицию в состоянии,решение:

      List<String> states = new ArrayList<>(); 
      int cityPosition = states.indexOf(City); 
      SpinnerCity.setSelection(cityPosition);

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Самый простой способ - получить позицию состояния из вашего адаптера на значение state.Например:

int position = stateAdapter.getPosition(state);
SpinnerCity.setSelection(position)

для правильной работы значения в состоянии и в адаптере должны быть равны.если они не равны, позиция не будет возвращена правильно.

0 голосов
/ 29 января 2019

Невозможно установить адаптер Spinner с массивом пользовательских типов классов, список списков состояний.

Instead set adapter with List<String>:
     List<String> stateNames = new ArrayList();

 add stateName to the above arrayList from statesList;

Set this arrayList to state Spinner as Adapter.
  SpinnerCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
     State cityDetails = statesList.get(position); // here do like this
     List<String> cityList = cityDetails.getCities();
     ArrayAdapter citiesAdapter = new ArrayAdapter<>(this,
                    R.layout.city_list, R.id.citySpinnerText, cityList);
     SpinnerArea.setAdapter(citiesAdapter);
  //   SpinnerArea.setSelected(String city); // Remove this, no use
    }
0 голосов
/ 29 января 2019

Сначала вам нужно получить положение вашего элемента внутри адаптера.

int vPos = stateAdapter.getPosition("myStringValue");

Затем вы можете установить значение по умолчанию следующим образом:

SpinnerCity.setSelection( vPos );

Удачи!

...