java - 微调器值未正确设置
问题描述
我正在尝试设置从另一个片段传递的微调器值。这个微调器填充了来自 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));
}
}
解决方案
我遇到的问题是由于在 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);
}
推荐阅读
- javascript - 检查状态中的值是否在类组件中更改
- google-api - 来自 Google DV360 API 的报告数据
- android - 如何删除 Android Studio 线路错误?请帮我
- php - 如何仅显示当前产品的一个父级的第三个产品类别子级?- WooCommerce
- anylogic - Anylogic 模型作业同时运行
- c# - C#从文件中提取值
- vue.js - Vuejs:传递参数后路由器链接不正确
- powershell - '术语'New-ComplianceTag' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称
- html - etree解析带有转义html的xml
- mysql - 如何在 Python 中使用合并的单元格将 SQL 导出到 Excel