我是Android的新手,我正在尝试在我的学校项目中执行以下任务:
我有一个电影的网格视图,用户可以无休止地滚动。 当应用程序启动时,我获取前20部电影,每次用户滚动到网格底部时,我执行AsyncTask以获取20多部电影并将其添加到适配器。
当用户点击电影时,他会转到新的子活动以查看电影详情。
在以下情况下,我遇到了维护GridView滚动位置的麻烦:
在处理这两个案例时,我还需要考虑到用户可能会滚动很多并且在适配器中有100部电影,当他回去时,活动从一开始只有前20部电影开始,所以我可以滚动到他的最后位置。
有人可以告诉我如何在不损失用户滚动位置的情况下,如何在项目中提供最佳用户体验?
答案 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)
点击mainActivity
后尝试不完成gridItem
,因此当用户导航回mainActivity
(来自detailsActivity
)时,他将获得所有数据之前有。
您可以通过活动的生命周期回调来处理这种情况:
您可以获得当前可见的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