屏幕方向更改后恢复 Android GridView(无需重新加载)
Restore Android GridView after screen orientation change (without reloading it)
我是 Android 的新手(这是我的第一个应用程序),我在 Activity
中创建了一个 GridView
,我希望它能够根据屏幕进行响应位置(纵向/横向)。当然,我为纵向和横向制作了一些 GridView
行宽的自定义布局值,并且效果很好。
除此之外,在每次屏幕方向更改时,GridView
都会再次重新加载。这对用户体验不利。我只喜欢 GridView
(绝对是它的行)调整到新的屏幕宽度,而无需执行所有 onCreate()
指令(从互联网检索 GridView
的数据,将检索到的数据分配到 HashMap
对象,设置GridView
的Adapter
,然后显示GridView
的行。
我浏览了很多论坛帖子和一些讨论恢复简单值的 Google 文档,但从未找到无需重新加载即可恢复 GridView
的答案。
我读到了 onSaveInstanceState()
和 onRestoreInstanceState()
,但我不知道如何在我的案例中使用它们(GridView
案例)。
有人可以为此提供一个简单的代码示例吗?或者至少要关注一些头条新闻?
这是我在代码中尝试的一些内容,在 Activity
class :
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);
}
您不需要保存视图。如果它们有 ID,它们将被自动保存(例如 GridView 的滚动位置)。您需要保存的是适配器的数据集。
您的适配器可能包含一个项目列表。除非这些项目是原语或 String
或实现 Serializable
,否则它们需要实现 Parcelable
才能工作。
在此处查看操作方法:How can I make my custom objects Parcelable?
您的适配器需要一个 getItems
方法,该方法 returns 数据集 - 一个 ArrayList
可包裹项目。它还需要有一个 setItems(...)
方法或一个将项目列表作为参数的构造函数。
那么你的 activity 将如下所示:
@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());
}
我是 Android 的新手(这是我的第一个应用程序),我在 Activity
中创建了一个 GridView
,我希望它能够根据屏幕进行响应位置(纵向/横向)。当然,我为纵向和横向制作了一些 GridView
行宽的自定义布局值,并且效果很好。
除此之外,在每次屏幕方向更改时,GridView
都会再次重新加载。这对用户体验不利。我只喜欢 GridView
(绝对是它的行)调整到新的屏幕宽度,而无需执行所有 onCreate()
指令(从互联网检索 GridView
的数据,将检索到的数据分配到 HashMap
对象,设置GridView
的Adapter
,然后显示GridView
的行。
我浏览了很多论坛帖子和一些讨论恢复简单值的 Google 文档,但从未找到无需重新加载即可恢复 GridView
的答案。
我读到了 onSaveInstanceState()
和 onRestoreInstanceState()
,但我不知道如何在我的案例中使用它们(GridView
案例)。
有人可以为此提供一个简单的代码示例吗?或者至少要关注一些头条新闻?
这是我在代码中尝试的一些内容,在 Activity
class :
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);
}
您不需要保存视图。如果它们有 ID,它们将被自动保存(例如 GridView 的滚动位置)。您需要保存的是适配器的数据集。
您的适配器可能包含一个项目列表。除非这些项目是原语或 String
或实现 Serializable
,否则它们需要实现 Parcelable
才能工作。
在此处查看操作方法:How can I make my custom objects Parcelable?
您的适配器需要一个 getItems
方法,该方法 returns 数据集 - 一个 ArrayList
可包裹项目。它还需要有一个 setItems(...)
方法或一个将项目列表作为参数的构造函数。
那么你的 activity 将如下所示:
@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());
}