2015-11-03 83 views
0

我是Android新手,我正在嘗試在我的學校項目上完成以下任務:如何在所有情況下保持Android GridView的位置?

我有一個用戶可以無限滾動的電影網格視圖。 當應用程序啓動時,我獲取前20部電影,每當用戶滾動到網格的底部時,我執行一個AsyncTask以獲取20多部電影並將它們添加到適配器。

當用戶點擊電影時,他會轉到新的兒童活動以查看電影詳情。

我有麻煩保持在下列情況下GridView的滾動位置:

  1. 當用戶進入到細節活動並返回到電影的主要活動。
  2. 當用戶更改設備方向時。

而在處理這兩個案例時,我還需要考慮到用戶可能滾動了很多並且在適配器中有100部電影,並且當他返回活動時從一開始就只有前20個電影,所以我可以滾動到他最後的位置。

有人可以告訴我如何在我的項目中通過不失去用戶的滾動位置給我最好的用戶體驗?

回答

1

我不知道這是不是最好的做法,但對我來說它是。 我決定將我的適配器設置爲一個全局靜態變量,這樣我就可以保持通過API加載的數據量,而且我不需要每次用戶在活動之間移動時都執行請求。 爲了保持滾動位置,我在移動到細節活動時使用了onItemClickListener,在改變方向時使用了savedInstanceState

這裏是我的代碼:

//Static variables 
private static MoviesAdapter mMoviesAdapter; 
private static int mGridViewPosition = 0; 

//Call this method when user clicks the back button 
public static void ClearStaticData(){ 
    mMoviesAdapter.clear(); 
    mMoviesAdapter = null; 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    int index = mGridView.getFirstVisiblePosition(); 
    outState.putInt(GRID_VIEW_POSITION, index); 
    super.onSaveInstanceState(outState); 
} 

@Override 
public View onCreateView(...) { 
    if (mMoviesAdapter == null) { 
     mMoviesAdapter = new MoviesAdapter(...); 
    } else { 
     RestoreGridPosition(); 
    } 
} 

private void RestoreGridPosition(){ 
    if(mGridViewPosition > 0 && mMoviesAdapter.getCount() >= mGridViewPosition) 
     mGridView.setSelection(mGridViewPosition); 
} 

因爲我通過調用API填補我的適配器,我想這大概是保存數據,而不是執行的請求,每次的最佳解決方案。

0
  1. 儘量不要整理mainActivity一旦gridItem被點擊,所以當用戶導航回mainActivity(從detailsActivity),他將擁有所有,這是有之前的數據。

  2. 您可以處理這種情況與活動的生命週期回調:

你可以得到當前可見的GridView項目的位置是這樣的:

int mCurrentPosition = gridview.getFirstVisiblePosition(); 

當取向變化正在發生的活動重新制作並經歷以下幾個階段:

onSaveInstanceState
onRestoreInstanceState

然後,您可以在方向更改發生之前保存位置,並在恢復方向時將其恢復。

保存你的活動狀態

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
// Save the user's current scroll state 
savedInstanceState.putInt(STATE_POSITION, mCurrentPosition); 

// Always call the superclass so it can save the view hierarchy state 
super.onSaveInstanceState(savedInstanceState); 
} 

恢復你的活動狀態

public void onRestoreInstanceState(Bundle savedInstanceState) { 
    // Always call the superclass so it can restore the view hierarchy 
    super.onRestoreInstanceState(savedInstanceState); 

    // Restore state members from saved instance 
    mCurrentPosition = savedInstanceState.getInt(STATE_POSITION); 
} 

在這裏,一旦你有以前的位置,你可以移動到GridView中所需位置:

gridview.smoothScrollToPosition(int mCurrentPosition) 

這從Android電子文檔採取:Recreating an Activity
滾動GridView的定位GridView scrolling stackoverflow

+0

謝謝你的回答。你能告訴我我如何 1.「沒有完成mainActivity一旦gridItem被點擊」? 2.'gridview.getFirstVisiblePosition();'有時會帶來半滾動項目的位置,並且它不能很好地工作...... –

+0

由於我使用了一個片段,我似乎沒有'onRestoreInstanceState'事件。 –

+0

你說得對。檢查下面的[stackoverflow問題](http://stackoverflow.com/questions/5412746/android-fragment-onrestoreinstancestate) –

相關問題