在所有情况下如何维护Android GridView的位置?

时间:2015-11-03 05:18:51

标签: android gridview

我是Android的新手,我正在尝试在我的学校项目中执行以下任务:

我有一个电影的网格视图,用户可以无休止地滚动。 当应用程序启动时,我获取前20部电影,每次用户滚动到网格底部时,我执行AsyncTask以获取20多部电影并将其添加到适配器。

当用户点击电影时,他会转到新的子活动以查看电影详情。

在以下情况下,我遇到了维护GridView滚动位置的麻烦:

  1. 当用户进入详情活动并返回电影的主要活动时。
  2. 当用户更改设备方向时。
  3. 在处理这两个案例时,我还需要考虑到用户可能会滚动很多并且在适配器中有100部电影,当他回去时,活动从一开始只有前20部电影开始,所以我可以滚动到他的最后位置。

    有人可以告诉我如何在不损失用户滚动位置的情况下,如何在项目中提供最佳用户体验?

2 个答案:

答案 0 :(得分: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调用填充了我的适配器,我认为这可能是保存数据而不是每次都执行请求的最佳解决方案。

答案 1 :(得分:0)

  1. 点击mainActivity后尝试不完成gridItem,因此当用户导航回mainActivity(来自detailsActivity)时,他将获得所有数据之前有。

  2. 您可以通过活动的生命周期回调来处理这种情况:

  3. 您可以获得当前可见的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 docs:Recreating an Activity
    将gridView滚动到GridView scrolling stackoverflow

    位置