Неправильно установлено значение счетчика - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь установить значение счетчика, которое было передано из другого фрагмента. Этот счетчик заполняется данными из LiveModel, и я хочу просто установить индекс счетчика на переданное значение String.

В настоящее время приведенный ниже код дает мне значение счетчика по умолчанию, так как строка ниже возвращает -1;

spinner.setSelection(adapter.getPosition(holidaySelected));

Может кто-нибудь увидеть, почему это возвращает -1, а не положение Адаптер, в котором находится значение?

Я читал эту ветку: Как установить выбранный элемент Spinner по значению, а не по положению?

public class PlaceInputFragment extends Fragment {

private String holidaySelected;
private HolidayViewModel holidayViewModel;
private List<String> holidayNames;
private Spinner spinner;
private ArrayAdapter<String> adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    holidayNames = new ArrayList<>();
    spinner = v.findViewById(R.id.spinner);
    adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, holidayNames);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    holidayViewModel = ViewModelProviders.of(this).get(HolidayViewModel.class);
    holidayViewModel.getAllHolidays().observe(this, new Observer<List<Holiday>>() {
        @Override
        public void onChanged(@Nullable final List<Holiday> holidays) {
            for (Holiday holiday : holidays) {
                holidayNames.add(holiday.getName());
            }
            adapter.notifyDataSetChanged();
        }
    });
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (getArguments() != null) {
    spinner = v.findViewById(R.id.spinner);

        holidaySelected = getArguments().getString("Holiday");
        spinner.setSelection(adapter.getPosition(holidaySelected));
    }
}

1 Ответ

0 голосов
/ 31 марта 2020

Проблема, с которой я столкнулся, связана с тем, что в onViewCreated, когда я хотел установить выбранный элемент в счетчике, наблюдатель, настроенный для получения списка названий выходных, который заполняет счетчик значениями, еще не вернулся. Я забыл, что это работает в другой теме в фоновом режиме. В результате на этом этапе счетчик еще пуст. Оператор журнала, приведенный ниже, подтвердил это

Log.i(TAG, "Size of name list is " + holidayNames.size());

. Исправление, с которым я работал, заключалось в следующем: создать новое поле для PlaceInputFragment

private String holidayName;

В onCreateView установите его значение ДО выполнения каких-либо действий для инициализации spinner.

if (getArguments() != null) {
            holidayName = getArguments().getString("Holiday");
} else {
            holidayName = null;
}

Наконец, в обозревателе для getAllHolidays, ПОСЛЕ строки line adapter.notifyDataSetChanged (); Я поставил следующее:

if (holidayName != null) {
    int i = holidayNames.indexOf(holidayName);
    spinner.setSelection(i);
}

ДРУГОЙ способ сделать это было бы использовать safeArgs:

Установить holidayName в onViewCreated:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (getArguments() != null) {
PhotoInputFragmentArgs args PhotoInputFragmentArgs.fromBundle(getArguments());
holidayName = photo.getHolidayName();
}

Затем в обозревателе для getAllHolidays, ПОСЛЕ строки line adapter.notifyDataSetChanged (); поставить следующее:

if (holidayName != null) {
    int i = holidayNames.indexOf(holidayName);
    spinner.setSelection(i);
}
...