Android的ListView在屏幕旋转后消失
在我的布局中,我有一些按钮可以做出一些选择,然后用一个按钮来执行对数据库的查询。此查询的结果显示在此布局内的ListView
中。Android的ListView在屏幕旋转后消失
问题是如果我执行查询后旋转屏幕,ListView
消失并且必须再次执行查询。
我相信这是因为活动重新启动而发生的。继here我已经添加到我的活动清单android:configChanges="orientation|keyboardHidden"
和我的代码的建议说:
@Override public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.mylayout);
}
但是,这是行不通的。
这里是我的活动的完整代码:
public class MyClass extends ListActivity implements OnClickListener, OnCheckedChangeListener { @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
// Creates the buttons and setOnClickListener and setOnCheckedChangeListener
}
@Override
public void onClick(View v) {
// Manages the buttons and their functions
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// See what group in radio group is checked
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// After pressing one button, a query is made and a listview is shown.
// This it to handle the user choice after he clicks an item on the listview
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.mylayout);
}
}
这很奇怪,因为我有这样的一些其他活动:
public class AtoZ extends ListActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.atoz);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
}
}
这也执行数据库查询,显示它在ListView
然后处理用户选择。如果我旋转屏幕,ListView
仍然显示。
我该怎么办?
回答:
当您在onConfigurationChanged方法中执行setContentView时,将重新创建ListView。您需要再次将数据加载到ListView中。如果将ListView绑定到适配器,则需要在onConfigurationChanged中执行此操作。
回答:
当您进行方向更改时,您将不得不重做查询(如果您不保存),因为完成后会再次调用oncreate。
您可以尝试并存储您的列表视图中的数据,如共享首选项。
回答:
有两件事情可以解决你的问题:
求解答:
- 添加
android:configChanges="orientation|keyboardHidden"
在清单XML文件。 - REMOVE
onConfigurationChanged(Configuration newConfig)
功能。
因为每次Activity初始化时只调用一次onCreate()
。虽然您的用空数据重新加载并膨胀新视图R.layout.mylayout
=>您的列表将不会与数据绑定。
求解B:
移动数据绑定代码已被写入的onCreate()到压倒一切的方法onStart()
或onResume()
。我建议您使用onStart()
来处理数据绑定。
你应该会看到开发页Android Activity life cycle
(更新):
因为你点击列表条目的搜索按钮时加载listContent
,所以你必须保持活动中的数据以重建从它的列表(例如:一个搜索字符串)。然后在onStart()
中,您从这些数据重建您的列表。
但是,单击列表项来更改整个列表本身时,您的逻辑很奇怪。并注意:点击列表项上的按钮时也会触发onListItemClick(..)
。
回答:
你必须重写onSaveInstanceState
和onRestoreInstanceState
在onSaveInstanceState
保存在Bundle
的ListView
列表。
在onRestoreInstanceState
上,使用Bundle
恢复列表并重新创建适配器。
private ArrayList<String> data; @Override
protected void onSaveInstanceState(Bundle outState) {
outState.putSerializable("d", data);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState != null) {
data = (ArrayList<String>) savedInstanceState.getSerializable("d");
ListViewAdapter adapter = new ListViewAdapter(this, data);
ListView listView = (ListView) findViewById(R.id.layout_listview);
listView.setAdapter(adapter);
}
super.onRestoreInstanceState(savedInstanceState);
}
回答:
在清单文件下的活动中使用configChanges。
<activity ...
...
android:configChanges="orientation|screenSize|keyboard">
</activity
这对我有效。
以上是 Android的ListView在屏幕旋转后消失 的全部内容, 来源链接: utcz.com/qa/263826.html