2017-09-13 155 views
0

我有一個筆記應用程序,由此我實現了兩種類型的視圖:List和Grid Views。 用戶可以根據他的選擇在listViewgridView之間切換。我遇到的問題是,我一直試圖保存視圖的狀態,以便在啓動時打開選定的視圖。我試圖用SharedPreferences來實現這一點。我的代碼中發生了什麼錯誤?永久保存數據

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

您正在從正確的共享首選項檢索值,但您在哪裏使用該值來檢查和加載視圖?我沒有看到你的代碼中的任何實現。 –

+0

我正在做我的onOptionsItemSelected。檢查我更新的代碼。或者我做錯了 – Benfight

+0

您正在保存和檢索數據。你正在做的正確。但基於檢索到的數據,您需要在onCreate方法中添加條件。如果共享首選項爲false,則加載列表視圖,如果爲true,則加載網格視圖 –

回答

1

在這之後你的onCreate()

mViewIsChanged = sharedPreferences.getBoolean(KEY_NAME, false); 

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

添加此

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

還是把我所提供的邏輯在你的onResume() 希望幫助設置適配器後, 。

+0

將此邏輯放置在onCreate中給我一個空指針。是否因爲在onResume中設置適配器? – Benfight

+0

顯示你登錄貓。或者你在哪一行得到空指針異常? –

+0

我嘗試從onResume中檢索數據,但它不起作用 – Benfight