0

我是Android新手(這是我的第一個應用程序),我在Activity中製作了GridView,我希望它根據屏幕位置進行響應(風景素描)。當然,我爲肖像以及風景做了GridView行寬的一些自定義佈局值,並且它非常完美。 除此之外,在每個屏幕方向更改時,GridView將再次重新加載。這對用戶體驗不利。我只喜歡GridView(絕對是它的行)來調整到新的屏幕寬度,而不用做所有的onCreate()指令(檢索GridView的數據來自互聯網,分配HashMap對象中的退出數據,設置GridViewAdapter,然後顯示GridView的行)。 我經歷了許多論壇主題和一些Google文檔,討論了恢復簡單值的問題,但從來沒有找到答案來恢復GridView而無需重新加載。 我讀了onSaveInstanceState()onRestoreInstanceState(),但我不知道如何在我的情況下使用它們(GridView的情況)。在屏幕方向更改(無需重新加載)後恢復Android GridView

任何人都可以提供一個簡單的代碼示例嗎?或者至少有一些標題要遵循?

這裏有一些什麼我想在我的代碼,在Activity類:

private Parcelable mListInstanceState; 
    private Parcelable mAdapterInstanceState; 

    private GridView gridView = null; 
    private MyAdapter myAdapter = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     gridView = (GridView) findViewById(R.id.gridview); 

     // Check whether we're recreating a previously destroyed instance 
     if(savedInstanceState != null) { 
      // Restore value of members from saved state 
      mListInstanceState = savedInstanceState.getParcelable("gridview"); 
      mAdapterInstanceState = savedInstanceState.getParcelable("adapter"); 
     } 
     else { 
      // Retrieve data from internet, fill HashMap object, 
      // set Adapter and display GridView only for the first time the activity is created 
      attemptToDisplayGirdViewItems(); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle state) { 
     // Save activity state 

     super.onSaveInstanceState(state); 

     state.putParcelable("gridview", gridView.onSaveInstanceState()); 
     // state.putParcelable("adapter", myAdapter);    
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     // Retrieve and restore activity state 

     // Restore state members from saved instance 
     mListInstanceState = savedInstanceState.getParcelable("gridview"); 
     mAdapterInstanceState = savedInstanceState.getParcelable("adapter"); 

     super.onRestoreInstanceState(savedInstanceState); 
    } 
+1

你倒是應該保存數據(來自互聯網)只有... FX使用或者廢棄的'Activity.getLastNonConfigurationInstance()'或與非用戶界面的可保留片段...所有其他的東西應該在那裏... GridView是保存在'onSaveInstanceState'當前項目的位置,所以你應該打擾這... – Selvin

+1

http://selvin.pl/MainActivity.java.txt檢查CacheFragment類和它的用法......從互聯網獲得的數據存儲在'JSONArray CacheFragment.response'中,並且它在屏幕變換中「生存」... loadData啓動新的請求或立即返回數據取決於「響應」是s et已經或沒有 – Selvin

+0

謝謝@Selvin的幫助。我有點嘗試Eugen的解決方案,它的工作完美:) – AndroWeed

回答

2

你並不需要保存的意見。如果他們有ID,他們會自動保存(例如GridView的滾動位置)。您需要保存的是適配器的數據集。

您的適配器可能包含一個項目列表。除非這些項目是原始的或者String或者執行Serializable,否則他們需要實施Parcelable才能運行。

在這裏看到如何做到這一點:How can I make my custom objects Parcelable?

你的適配器需要一個getItems方法,它返回的數據集 - 您parcelable項目的ArrayList。它還需要有一個setItems(...)方法或構造函數以項目列表作爲參數。

那麼你的活動將是這樣的:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    gridView = (GridView) findViewById(R.id.gridview); 

    myAdapter = new MyAdapter(); // Create empty adapter. 
    if(savedInstanceState != null) { 
     ArrayList<MyItem> items = savedInstanceState.getParcelableArrayList("myAdapter"); 
     myAdapter.setItems(items); // Load saved data if any. 
    } 
    gridView.setAdapter(myAdapter); 
} 

@Override 
protected void onSaveInstanceState(Bundle state) { 
    super.onSaveInstanceState(state); 
    state.putParcelableArrayList("myAdapter", myAdapter.getItems()); 
} 
+0

親愛的朋友Eugen Pechanec,我無法感謝你的仁慈和慷慨的幫助。你不僅拯救了我的一天,也拯救了我的生命。非常感謝!!我很高興認識你:) – AndroWeed

+1

@MouradJEMAÏL你剛剛做了我的一天:D很高興能幫到你。現在我建議專注於從互聯網有效地加載項目。你可以看看這個https://www.youtube.com/watch?v=BlkJzgjzL0c(雖然它可能有點沉重)。由於每個配置更改都有一個新的活動實例,因此不能依賴與其原始活動關聯的簡單異步任務。祝你好運! –

+0

謝謝我的朋友:)真的,視頻聽起來很有趣。我對任何可能優化我在android開發中的練習的資源開放,肯定會幫助我學習更多:) – AndroWeed