10

Utilizzo un dropdown di selezione nel mio codice, in cui sono presenti da 4 a 5 valori dinamicamente compilati, ad esempio se ho impostato "mele" come predefinite e seleziono "arance" dal menu a discesa e ruoto lo schermo in orizzontale da verticale , torna alle "mele" predefinite insieme alla vista associata. Come faccio a salvare lo stato in modo tale che quando seleziono "arance" e ruoto in orizzontale, esso popola il valore selezionato/rimane nello stesso stato selezionato e mantiene la vista intatta/popola la vista selezionata nella modalità verticale corrispondente al valore selezionato. Ecco il codice dell'adattatore che uso per lo stesso:Come mantenere lo stato di un oggetto selezionato di selezione/selezione in caso di modifica dell'orientamento?

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); 
    } 

} 

utilizzo corrispondente nel rispettivo frammento:

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) { 
    } 

Tutte le idee?

Grazie!

risposta

17

Si può fare questo tipo ...

@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 
    } 
} 

Spero che questo aiuti

+1

La mia selezione è definita in onCreateOptionsMenu. Come posso risolverlo? – TeodorKolev

+1

Questa soluzione potrebbe far sì che lo spinner chiami OnItemSelected() più volte. –

+0

@SamRamezanli Una spiegazione che spiega perché il metodo potrebbe essere chiamato più volte sarebbe utile. – Elyasin

0

Se la configurazione del dispositivo (come definito dalle Resources.Configuration classe) modifiche, quindi tutto ciò che visualizza un'interfaccia utente avrà bisogno aggiornare per abbinare quella configurazione e quindi il tuo Activity Se non diversamente specificato, una modifica della configurazione (come una modifica dell'orientamento dello schermo, della lingua, dei dispositivi di input, ecc.) causerà la distruzione della tua attività corrente, passando per il normale Activity lifecycle process di onPause() , onStop() e onDestroy() come appropriato.

Se l'attività fosse stata in primo piano o visibile all'utente, una volta OnDestroy() si chiama in quel caso allora verrà creata una nuova istanza di attività, con qualsiasi savedInstanceState l'istanza precedente aveva generato da onSaveInstanceState(Bundle).

Ciò è possibile perché qualsiasi risorsa dell'applicazione, inclusi i file di layout, può cambiare in base a qualsiasi valore di configurazione. In alcuni casi speciali (proprio come il tuo, se sto andando bene, se hai solo spinner/dropdown sull'interfaccia utente corrente & non devi necessariamente completare il ciclo di vita delle attività), potresti voler evitare il riavvio della tua attività in base a uno o più tipi di modifiche alla configurazione. Questo viene fatto con l'attributo android:configChanges nel suo manifesto e/o si può anche utilizzare onSaveInstanceState(Bundle) che è chiamante quando l'attività viene distrutto e ricreato dalla begening.

Devi semplicemente due modi per risolvere questo problem_

1_

    1. Aggiungere android: configChanges = "orientamento" nel file manifesto del tag attività.
<?xml version="1.0" encoding="utf-8"?> 
<manifest ... 
> 
<application ... 
    >  
    <activity 
     android:name="SpinnerActivity" 
     android:configChanges="orientation" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 
  • 2, Override onConfigurationChanged, che è chiamato dal sistema quando le modifiche alla configurazione del dispositivo, mentre l'attività è in esecuzione.
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    int orientation = newConfig.orientation; 

    switch (orientation) { 
    case Configuration.ORIENTATION_LANDSCAPE: 
     // do what you want when user is in LANDSCAPE 
     break; 

    case Configuration.ORIENTATION_PORTRAIT: 
     // do what you want when user is in PORTRAIT 
     break; 
    } 

} 

2_

utilizzare i metodi messi a memorizzare i valori in onSaveInstanceState():

protected void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    //Put your spinner values to restore later... 
    savedInstanceState.putLong("yourSpinnerValKey", yourSpinner.getSelectedItemPosition()); 
} 

e ripristinare i valori in onCreate():

public void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState!= null) { 
    //get your values to restore... 
     value = savedInstanceState.getLong("param"); 
    } 
} 

Questo risolverà sicuramente il tuo problema e non aggiornerà il tuo spinner quando cambi l'orientamento dello schermo. Spero che questo ti possa aiutare e tutto! :)

+0

dove è stato salvato lo stato dello spinner? –

+0

@justice, si prega di consultare le ans aggiornate. –

Problemi correlati