恢复旋转器及其适配器的状态

时间:2017-12-28 19:56:40

标签: android spinner android-arrayadapter onsaveinstancestate onrestoreinstancestate

我在尝试在我的应用程序中恢复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();

2 个答案:

答案 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#'