微调器值未正确设置

Spinner value not being correctly set

我正在尝试设置从另一个 Fragment 传递过来的微调器值。这个微调器填充了来自 LiveModel 的数据,我只想将微调器的索引设置为传递的字符串值。

目前,下面的代码为我提供了微调器的默认值,如下面的行 returns -1;

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

谁能看出为什么返回 -1 而不是值所在的适配器位置?

我已阅读此主题:How to set selected item of Spinner by value, not by position?

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));
    }
}

我遇到的问题是因为在 onViewCreated 中,当我想在微调器中设置所选项目时,您设置的观察者获取假期名称列表,该列表用值填充微调器还没有回来。我忘了这是在后台的另一个线程中运行的。结果是此时微调器仍然是空的。下面的日志语句证实了这一点

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

我使用的修复方法是: 为 PlaceInputFragment

创建一个新字段
private String holidayName;

在执行任何初始化微调器之前,在 onCreateView 中设置它的值。

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

最后在 getAllHolidays 的观察者中,在行 adapter.notifyDataSetChanged() 之后;我放了以下内容:

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

另一种方法是使用 safeArgs:

在onViewCreated中设置holidayName:

@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 的观察者中,在行 adapter.notifyDataSetChanged(); 之后输入以下内容:

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