我在尝试在我的应用程序中恢复Android Spinners的状态时遇到问题。目前,我的Activity的ListView标题中有多个Spinners彼此依赖,因为选择一个Spinner会为后续的Spinner加载数据。
我遇到的问题是,当我在Spinners上手动设置选择时,恢复状态似乎不起作用。我已经尝试过onRestoreInstanceState和onResume。看起来设置选择在查看LogCat输出时是异步的。如果我必须在另一个可以填充然后设置之前等待一个Spinners,我怎样才能可靠地恢复这些Spinners的状态?
编辑:添加了代码
活动onCreate():
mSecondSpinner = mMyListHeader.findViewById(R.id.second_spinner);
mSecondSpinnerArrayAdapter = new SecondArrayAdapter(MyActivity.this, R.layout.second_spinner_item, new ArrayList<MySecondDto>());
mSecondSpinner.setAdapter(mSecondSpinnerArrayAdapter);
mSecondSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
MySecondDto selectedMySecondDto = (MySecondDto) parent.getItemAtPosition(position);
List<MyThirdDto> myThirdDtos = selectedMySecondDto.getMyThirdDtos();
// Load third spinner with dtos....
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}}
);
mFirstSpinner = mMyListHeader.findViewById(R.id.first_spinner);
mFirstSpinnerAdapter= new FirstArrayAdapter(MyActivity.this, R.layout.first_spinner, mResponse.getAllDtos());
mFirstSpinner.setAdapter(mFirstSpinnerArrayAdapter);
mFirstSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mSecondSpinner.setAdapter(null);
MyFirstDto selectedMyFirstDto = (MyFirstDto ) parent.getItemAtPosition(position);
List<MySecondDto> mySecondDtos = selectedMyFirstDto .getMySecondDtos();
mSecondSpinnerArrayAdapter.clearAndReplaceAll(mySecondDtos);
mSecondSpinner.setAdapter(mSecondSpinnerArrayAdapter);
// If there is only one second dto, disable the spinner
if (mySecondDtos== null || mySecondDtos.size() <= 1)
{
disableSpinner(mSecondSpinner);
}
else
{
// Enable second spinner, select the hint element
enableSpinner(mSecondSpinner);
mSecondSpinner.setSelection(mSecondSpinnerArrayAdapter .getHintIndex());
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
活动onRestoreInstanceState():
mFirstSpinner.setSelection(mFirstAdapterPosition);
mFirstSpinnerArrayAdapter.notifyDataSetChanged();
mSecondSpinner.setSelection(mSecondAdapterPosition);
mSecondSpinnerArrayAdapter.notifyDataSetChanged();
答案 0 :(得分:0)
你有没试过这个
mySpinner.post(new Runnable() { @Override public void run() { mySpinner.setSelection(position); } });
答案 1 :(得分:0)
这可能适合你。 在某处可能有一个错误,所以要小心。 我有类似的情况,但我有3个微调器,他们根据前一个的选择填充。
我们的想法是将Spinners的Indexes / Positions存储在IndexVariables中。 这些变量的默认值为-1。
将当前值存储在onSaveInstanceState中,
恢复onActivityCreated中的值。
在onItemSelected中检查是否选择了Item = null,检查是否设置了IndexVariable(即! - = -1)
如果是这样,使用它来设置Spinner,然后将IndexVariable设置回-1;
这是班级
(我使用了来自How to make an Android Spinner with initial text "Select One"的NothingSelectedSpinnerAdapter。 不是很重要,只是向我得到那段代码的那个人/女孩大声喊叫。)
sed -e 's#/mount/m07#/m07#;t' -e 's#/m07#/mount/m07#'
#or
sed -e 's#/mount/m07#/m07#' -e 't' -e 's#/m07#/mount/m07#'