我是Android新手(这是我的第一个应用程序),我在GridView
中制作了Activity
,我希望它能根据屏幕位置做出响应(风景素描)。当然,我为纵向和横向制作了一些GridView
行宽的自定义布局值,它的工作非常完美。
除此之外,在每个屏幕方向更改时,GridView
再次重新加载。这对用户体验不利。我只喜欢GridView
(绝对是其行)来调整到新的屏幕宽度而不执行所有onCreate()
指令(从互联网检索GridView
的数据,分配已淘汰的数据在HashMap
对象中,设置GridView
' Adapter
,然后显示GridView
行。
我浏览了许多论坛主题和一些关于恢复简单值的Google文档,但从未找到恢复GridView
而无需重新加载的答案。
我读到了onSaveInstanceState()
和onRestoreInstanceState()
,但我不知道如何在我的案例中使用它们(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);
}
答案 0 :(得分:4)
您无需保存视图。如果他们有ID,他们将自动保存(例如GridView的滚动位置)。您需要保存的是适配器的数据集。
您的适配器可能包含项目列表。除非这些项目是基元或String
或实施Serializable
,否则他们需要实施Parcelable
才能实现此目的。
请在此处查看如何执行此操作:How can I make my custom objects Parcelable?
您的适配器需要一个getItems
方法来返回数据集 - 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());
}