在我的布局上,我有一些按钮可以做出一些选择,然后有一个按钮来执行对数据库的查询。此查询的结果显示在此布局中的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
仍会显示。
我该怎么办?
答案 0 :(得分:7)
在清单文件下的活动中使用configChanges。
<activity
...
...
android:configChanges="orientation|screenSize|keyboard">
</activity
这对我有用。
答案 1 :(得分:5)
有两件事可以解决你的问题:
求解器A:
android:configChanges="orientation|keyboardHidden"
。onConfigurationChanged(Configuration newConfig)
功能。因为每次初始化Activity时只调用onCreate()
一次。在您的onConfigurationChanged()
重新加载并使用空数据=&gt;膨胀新视图R.layout.mylayout
的同时您的列表不会与数据绑定。
求解器B:
移动您在onCreate()中编写的数据绑定代码覆盖方法 onStart()
或 onResume()
即可。我建议您使用onStart()
进行数据绑定。
您应该会看到“开发”页面Android Activity life cycle
(适用更新):强>
因为您在单击列表项上的搜索按钮时加载了listContent
,所以您必须维护活动中的数据以从中重建列表(例如:一串搜索)。然后在onStart()
中根据此数据重建列表。
但是,单击List的项目以更改整个List本身时,您的逻辑很奇怪。请注意:单击列表项上的按钮时,也会触发onListItemClick(..)
。
答案 2 :(得分:3)
在onConfigurationChanged方法中执行setContentView时,会重新创建ListView。您需要再次将数据加载到ListView中。如果要将ListView绑定到适配器,则需要在onConfigurationChanged中执行此操作。
答案 3 :(得分:2)
您必须覆盖onSaveInstanceState
和onRestoreInstanceState
在onSaveInstanceState
上保存ListView
上的Bundle
列表。
在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);
}
答案 4 :(得分:-1)
当您进行方向更改时,您将不得不重做查询(如果不保存它),因为完成此操作后,将再次调用oncreate。
您可以尝试存储列表视图中的数据,例如共享首选项。