1

私のアプリケーションでAndroidスピナーの状態を復元しようとする際に問題があります。現在、アクティビティーのListViewヘッダーには複数のスピナーがあり、それぞれのスピナーは後続のスピナーのデータを読み込むため、相互に依存します。スピナーとアダプターの状態を復元する

私が経験している問題は、Spinnersで手動で選択項目を設定すると、状態の復元が機能していないように見えるということです。私はonRestoreInstanceStateとonResumeの両方で試しました。 LogCatの出力を見ると、非同期の選択肢が設定されているようです。他の人が入力されて設定される前に、どれが選択されるのを待たなければならないとき、これらのスピナーの状態を確実に元に戻すことができますか?

編集:コードを追加しました

活動のの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

だあなたはしてみてくださいました。 ... BaseAdapterアダプタ=(BaseAdapter)yourSpinner.getAdapter(); adapter.notifyDataSetChanged(); – DroiDev

+0

サンプルコードスニペットを入力してください。 –

+0

@NikhilLotkeいくつかのコードでポストを更新しました。 – JPM

答えて

0

uがこの

を試してみました
mySpinner.post(new Runnable() { @Override public void run() { mySpinner.setSelection(position); } }); 
+0

の内部にある必要があります。私はあなたが何を意味するか分かりません。これはonRestoreInstanceStateで行われますか?また、選択が最初のスピナーで完了するまで、どのように「待つ」ことになりますか? – JPM

0

これはうまくいく可能性があります。 どこかにバグがある可能性があるので注意してください。 私はあなたに似たような状況がありますが、私は3つのスピナーを持っていて、前のものの選択に応じて人口が集まります。

考え方は、スピナーのインデックス/ポジションをIndexVariablesに保存することです。 これらの変数のデフォルト値は-1です。

ストアonSaveInstanceStateの現在値、

はonActivityCreatedの値を復元します。 onItemSelectedチェックで

アイテム= nullを選択した場合IndexVariableが設定された場合、(すなわち、 - = -1!)チェック

ので、スピナーを設定するためにそれを使用する場合、-1に戻すIndexVariableを設定します。ここで

はクラスが

(私はHow to make an Android Spinner with initial text "Select One"からNothingSelectedSpinnerAdapterを使用。 本当に重要ちょうど私がそのコードを得た男/女に大声で叫ぶを与えていない。)

public class SpinnerTestFragment extends Fragment { 

private MainActivity activity; 

private static final String SELECTED_THEME_IDX_STORAGE_KEY = "mSelectedTheme_IDX_StorageKey"; 
private static final String SELECTED_AIM_IDX_STORAGE_KEY = "mSelectedAim_IDX_StorageKey"; 
private static final String SELECTED_GOAL_IDX_STORAGE_KEY = "mSelectedGoal_IDX_StorageKey"; 

private static String TAG = "SpinnerTestFragment"; 

private Spinner spnrThemes; 
private Spinner spnrAims; 
private Spinner spnrGoals; 

private String mSelectedTheme; 
private String mSelectedAim; 
private String mSelectedGoal; 

private int mSelectedAimIdx = -1; 
private int mSelectedThemeIdx = -1; 
private int mSelectedGoalIdx = -1; 


//----------------------------------------------------------------------------------------// 


public SpinnerTestFragment() { 
}//ctor 

//----------------------------------------------------------------------------------------// 

@Override 
public View onCreateView(LayoutInflater inflater, 
         ViewGroup container, 
         Bundle savedInstanceState) { 
    Log.d(TAG, "onCreateView"); 

    activity = (MainActivity) getActivity(); 


    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_photo, container, false); 


    spnrThemes = view.findViewById(R.id.spnrThemes); 
    spnrAims = view.findViewById(R.id.spnrAims); 
    spnrGoals = view.findViewById(R.id.spnrGoals); 


    setSpinner(spnrThemes, "Select Theme", ThemesAimsGoals.getThemes()); 

    spnrThemes.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      Object selectedItem = parent.getItemAtPosition(position); 

      if (selectedItem != null) { 
       mSelectedTheme = selectedItem.toString(); 
       setSpinner(spnrAims, "Select Aim", ThemesAimsGoals.getAims(mSelectedTheme)); 

      } else if(mSelectedThemeIdx != -1){ 
       selectedItem = parent.getItemAtPosition(mSelectedThemeIdx); 
       mSelectedTheme = selectedItem.toString(); 
       setSpinner(spnrAims, "Select Aim", ThemesAimsGoals.getAims(mSelectedTheme)); 
       parent.setSelection(mSelectedThemeIdx); 
       mSelectedThemeIdx = -1; 
      }//Else 
     }//onItemSelected 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
     } 
    }); 


    spnrAims.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      Object selectedItem = parent.getItemAtPosition(position); 

      if (selectedItem != null) { 
       mSelectedAim = selectedItem.toString(); 
       setSpinner(spnrGoals, "Select Goal", ThemesAimsGoals.getGoals(mSelectedTheme, mSelectedAim)); 

      } else if(mSelectedAimIdx != -1){ 
       selectedItem = parent.getItemAtPosition(mSelectedAimIdx); 
       mSelectedAim = selectedItem.toString(); 
       setSpinner(spnrGoals, "Select Goal", ThemesAimsGoals.getGoals(mSelectedTheme, mSelectedAim)); 
       parent.setSelection(mSelectedAimIdx); 
       mSelectedAimIdx = -1; 
      }//Else 
     }//onItemSelected 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
     } 
    }); 

    spnrGoals.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      Object selectedItem = parent.getItemAtPosition(position); 
      if (selectedItem != null) { 
       mSelectedGoal = selectedItem.toString(); 

      }else if(mSelectedGoalIdx != -1){ 
       selectedItem = parent.getItemAtPosition(mSelectedGoalIdx); 
       mSelectedGoal = selectedItem.toString(); 
       parent.setSelection(mSelectedGoalIdx); 
       mSelectedGoalIdx = -1; 
      }//Else 
     }//onItemSelected 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
     } 
    }); 

    return view; 
}//onCreateView 

//----------------------------------------------------------------------------------------// 

/** 
* Populate Spinner 
* @param spnr Spinner to populate 
* @param prompt What to show at the start 
* @param array Items in the spinner 
*/ 
private void setSpinner(Spinner spnr, String prompt, String[] array) { 
    spnr.setPrompt(prompt); 
    ArrayAdapter<CharSequence> adapter = new ArrayAdapter(activity, android.R.layout.simple_spinner_item, array); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spnr.setAdapter(
      new NothingSelectedSpinnerAdapter(
        adapter, 
        R.layout.contact_spinner_row_nothing_selected, 
        activity, 
        prompt)); 
}//setSpinner 

//----------------------------------------------------------------------------------------// 

/** 
* Some lifecycle callbacks so that the image can survive orientation chang 
* 
* @param outState current state of fragment 
*/ 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    Log.d(TAG, "onSaveInstanceState"); 
    super.onSaveInstanceState(outState); 

    outState.putInt(SELECTED_THEME_IDX_STORAGE_KEY, spnrThemes.getSelectedItemPosition()); 
    outState.putInt(SELECTED_AIM_IDX_STORAGE_KEY, spnrAims.getSelectedItemPosition()); 
    outState.putInt(SELECTED_GOAL_IDX_STORAGE_KEY, spnrGoals.getSelectedItemPosition()); 

}//onSaveInstanceState 

//----------------------------------------------------------------------------------------// 

/** 
* Rebuilds the Activity/Fragment in the image of the last one. 
* 
* @param savedInstanceState Info from last session or rotation 
*/ 
@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    Log.d(TAG, "onActivityCreated"); 

    if (savedInstanceState == null) 
     return; 

    mSelectedThemeIdx = savedInstanceState.getInt(SELECTED_THEME_IDX_STORAGE_KEY); 
    mSelectedAimIdx = savedInstanceState.getInt(SELECTED_AIM_IDX_STORAGE_KEY); 
    mSelectedGoalIdx = savedInstanceState.getInt(SELECTED_GOAL_IDX_STORAGE_KEY); 


}//onActivityCreated 

}//Cls 
関連する問題