首页 > 解决方案 > 微调器值未正确设置

问题描述

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

目前,下面的代码为我提供了微调器的默认值,因为下面的行返回 -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));
    }
}

标签: javaandroidspinner

解决方案


我遇到的问题是由于在 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);
}

推荐阅读