How do I preserve the state of a selected spinner/dropdown item on orientation change?

20,394

You can do this like...

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("yourSpinner", yourSpinner.getSelectedItemPosition());
    // do this for each or your Spinner
    // You might consider using Bundle.putStringArray() instead
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // initialize all your visual fields        
    if (savedInstanceState != null) {
        yourSpinner.setSelection(savedInstanceState.getInt("yourSpinner", 0));
        // do this for each of your text views
    }
}

Hope this helps

Share:
20,394
Admin
Author by

Admin

Updated on July 09, 2022

Comments

  • Admin
    Admin almost 2 years

    I am using a spinner dropdown in my code , in which I have 4 to 5 dynamically populated values, say if I have "apples" set to default and I select "oranges" from the dropdown and rotate my screen to landscape from portrait, it goes back to default "apples" along with the view associated with it.How do I save the state such that when I select "oranges" and rotate to landscape, it populates the selected value/remains in the same selected state and keeps the view intact/populates the view that was selected in the portrait mode corresponding to the selected value. Here's the adapter code I use for the same:

    public class MarketsSpinnerAdapter extends CustomRowAdapter<AdapterRow> {
    
    
        private List<AdapterRow> mRenderList;
    
        public MarketsSpinnerAdapter(final Context context, final List<AdapterRow> renderList) {
            super(context);
    
    
            mRenderList = new ArrayList<AdapterRow>();
            mRenderList.addAll(renderList);
        }
    
        @Override
        protected void setEntries(final List<AdapterRow> renderList) {
            mRenderList = renderList;
        }
    
        @Override
        protected List<AdapterRow> getEntries() {
            return mRenderList;
        }
    
        @Override
        public View getDropDownView(final int position, final View convertView, final ViewGroup parent) {
            return getEntries().get(position).getDropDownView(mContext, convertView);
        }
    
    }
    

    Corresponding usage in the respective fragment:

     private void populateCategoryRows(final Cursor cursor) {
                mCategories.clear();
                mAllCategories.clear();
                cursor.moveToPosition(-1);
                Map<String, String> categoryParentNames = new HashMap<String, String>();
    
                int selectedPosition = 0;
                String previousHeader = "";
                String previousAllHeader = "";
    
                while (cursor.moveToNext()) {
                    final int categoryLevel = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.LEVEL));
                    final String categoryName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.NAME));
                    final String categoryDisplayName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.DISPLAY_NAME));
    
                    if (categoryLevel == 1) {
                        categoryParentNames.put(categoryName, categoryDisplayName);
                    }
                }
    
                cursor.moveToPosition(-1);
                while (cursor.moveToNext()) {
                    final int categoryLevel = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.LEVEL));
                    final boolean categoryIsDefault = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.IS_DEFAULT)) == 1;
                    final boolean categoryIsSelected = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.IS_SELECTED)) == 1;
                    final String categoryParent = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.PARENT));
                    final String categoryName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.NAME));
                    final String categoryDisplayName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.DISPLAY_NAME));
    
    
                    if (categoryLevel == 2 ) {
                        String categoryParentDisplayName = categoryParentNames.get(categoryParent);
                            if (!categoryParent.equals(previousHeader)) {
                                if (categoryIsSelected) {
    
                                    mCategories.add(new CategoryHeader(categoryParentDisplayName));
                                    previousHeader = categoryParent;
                                }
                            }
    
                            if (!categoryParent.equals(previousAllHeader)) {
                                mAllCategories.add(new CategoryHeader(categoryParentDisplayName));
                                previousAllHeader = categoryParent;
                            }
    
                            if (categoryIsSelected) {
                                mCategories.add(new SpinnerMarketCategoryRow(categoryName, categoryDisplayName, categoryParent));
                            }
                            mAllCategories.add(new MarketsCategoryCheckableRow(categoryName, categoryDisplayName, categoryIsSelected, categoryIsDefault));
    
                            if(categoryIsDefault){
                                selectedPosition = mCategories.size()-1;
                            }
                    }
                }
    
                mSpinnerAdapter = new MarketsSpinnerAdapter(Application.getAppContext(), mCategories);
                headerView.setSpinnerAdapter(mSpinnerAdapter);
                headerView.setSpinnerSelectedItemPosition(selectedPosition);
            }
            if (selectedItem instanceof SpinnerMarketCategoryRow) {
                selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position);
            } else {
                if (mSpinnerAdapter.getCount() - 1 >= position + 1) {
                    selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position + 1);
                } else {
                    selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position - 1);
                }
            }
    
            final MarketsFragment parentFragment = (MarketsFragment) getParentFragment();
            parentFragment.onCategorySelected(selectedCategory.getCategoryName(), selectedCategory.getCategoryParentName());
        }
    @Override
        public void showResults(final Uri uri) {
            LayoutUtils.showResults(getView(), headerView.getSpinnerId());
            headerView.setVisibility(View.VISIBLE);
        }
    
        @Override
        public void showNoResults(final Uri uri) {
            final MarketsFragment parentFragment = (MarketsFragment) getParentFragment();
            parentFragment.hideSpinner();
            //LayoutUtils.showNoResult(getView(), headerView.getSpinnerId());
        }
    
        @Override
        public void onDismiss(DialogInterface dialog) {
            headerView.setSelected(false);
        }
        @Override
        public void onNothingSelected(IcsAdapterView<?> parent) {
        }
    

    Any ideas?

    Thanks!

  • Admin
    Admin over 10 years
    where is the state of the spinner saved ?
  • IntoTheDeep
    IntoTheDeep almost 8 years
    My spinner is defined in onCreateOptionsMenu. How can I solve that?
  • Sam Ramezanli
    Sam Ramezanli over 7 years
    This solution might make the spinner call the OnItemSelected() multiple times.
  • Ely
    Ely about 7 years
    @SamRamezanli An explanation saying why the method could be called multiple times would be helpful.
  • Ajay Mistry
    Ajay Mistry about 6 years
    my spinner is in fragment ..how can i use it?