微调器值未正确设置
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);
}
我正在尝试设置从另一个 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);
}