2017-09-13 1 views
0

Ich habe eine Notes App, mit der ich zwei Arten von Ansichten implementiert habe: Listen- und Rasteransichten. Ein Benutzer kann je nach seiner Wahl zwischen listView und gridView wechseln. Das Problem, das ich habe, ist, dass ich versucht habe, den Zustand der Ansicht dauerhaft zu speichern, so dass die ausgewählte Ansicht beim Start geöffnet wird. Ich versuche, SharedPreferences zu verwenden, um dies zu erreichen. Was mache ich falsch in meinem Code?Daten persistent speichern

private static final String KEY_NAME = "viewState"; 
private ListView mListNotes; 
    private GridView mGridNotes; 
SharedPreferences sharedPreferences; 
    SharedPreferences.Editor editor; 
private boolean mViewIsChanged = false; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
// set the layouts for list/grid 
      mListNotes = (ListView) findViewById(R.id.main_listview); 
      mGridNotes = (GridView) findViewById(R.id.main_gridview); 
// Retrieve value from Shared Preferences. 
    sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
    mViewIsChanged = sharedPreferences.getBoolean(KEY_NAME, false); 
    if (!mViewIsChanged){ 
     mListNotes.setVisibility(View.VISIBLE); 
     mGridNotes.setVisibility(View.GONE);} 
    else { 
     mListNotes.setVisibility(View.GONE); 
     mGridNotes.setVisibility(View.VISIBLE); 
    } 


@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View customTitleView = inflater.inflate(R.layout.dialog_menu, null); 
     LinearLayout mListViewSelect = (LinearLayout) customTitleView.findViewById(R.id.list_select); 
     LinearLayout mGridViewSelect = (LinearLayout) customTitleView.findViewById(R.id.grid_select); 
     switch (item.getItemId()) { 
      case R.id.addItem: 
       // start NoteActivity 
       startActivity(new Intent(this, NoteActivity.class)); 
       break; 
      case R.id.changeView: 
       final AlertDialog alertbox = new AlertDialog.Builder(this).create(); 
       alertbox.setCancelable(true); 
       alertbox.setView(customTitleView); 
       alertbox.show(); 
       mListViewSelect.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 


// Saving Data 
sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
editor = sharedPreferences.edit(); 
        editor.putBoolean(KEY_NAME, mViewIsChanged); 
        editor.apply(); 
        mListNotes.setVisibility(View.VISIBLE); 
        mGridNotes.setVisibility(View.GONE); 
         alertbox.dismiss(); 
        } 
       }); 
     mGridViewSelect.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
// saving Data in SharedPreferences 
     mViewIsChanged = true; 
     sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
     editor = sharedPreferences.edit(); 
     editor.putBoolean(KEY_NAME, mViewIsChanged); 
     editor.apply(); 
     mListNotes.setVisibility(View.GONE); 
     mGridNotes.setVisibility(View.VISIBLE); 
     alertbox.dismiss(); 
    } 
}); 
+0

Sie rufen die Werte aus der gemeinsamen Einstellung richtig ab, aber wo verwenden Sie diesen Wert zum Überprüfen und Laden der Ansichten? Ich sehe keine Implementierung in Ihrem Code. –

+0

ich mache das in meinem onOptionsItemSelected. überprüfe meinen aktualisierten Code. oder mache ich es falsch – Benfight

+0

Sie speichern und retreiving Daten. Dass du es richtig machst. Aber basierend auf den abgerufenen Daten müssen Sie die Bedingung in der onCreate-Methode hinzufügen. Wenn shared preference false ist, dann lade die Listenansicht und wenn die Rasteransicht korrekt geladen wird, gab –

Antwort

1

Danach in Ihrem onCreate()

mViewIsChanged = sharedPreferences.getBoolean(KEY_NAME, false); 

mListNotes = (ListView) findViewById(R.id.main_listview); 
mGridNotes = (GridView) findViewById(R.id.main_gridview); 

Dieses

If (!mViewIsChanged){ 
    mListNotes.setVisibility(View.VISIBLE); 
    mGridNotes.setVisibility(View.GONE);} 
else { 
mListNotes.setVisibility(View.GONE); 
    mGridNotes.setVisibility(View.VISIBLE); 
} 

Oder die von mir gelieferten Logik setzen, nachdem Sie den Adapter in Ihrem onResume Einstellung() Hoffnung, die hilft .

+0

diese Logik in onCreate an und gab mir einen Nullzeiger. könnte es daran liegen, dass ich den adapter in onResume setze? – Benfight

+0

Zeigen Sie Protokollkatzen. Oder auf welcher Zeile erhalten Sie Nullzeiger Ausnahme? –

+0

Ich habe versucht, Daten von OnResume abzurufen, aber es hat nicht funktioniert – Benfight

Verwandte Themen