android屏幕旋转后,屏幕旋转后,Android列表视图消失

在我的布局上,我有一些按钮做出一些选择,然后一个按钮来执行对数据库的查询。 此查询的结果显示在此布局中的ListView 。

问题是如果在我执行查询后旋转屏幕, ListView消失并且必须再次执行查询。

我相信这种情况正在发生,因为活动重新开始。 按照这里的建议,我已经在清单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中执行此操作。

在清单文件下的活动中使用configChanges。

这对我有用。

有两件事可以解决你的问题:

求解器A:

在清单xml文件中添加 android:configChanges="orientation|keyboardHidden" 。

删除 onConfigurationChanged(Configuration newConfig)函数。

因为每次初始化Activity时都只调用onCreate()一次。 当你的onConfigurationChanged()用空数据重新加载和膨胀新视图R.layout.mylayout =>你的列表不会与数据绑定。

求解器B:

将已在onCreate()中编写的数据绑定代码移动 到重写方法onStart()或onResume() 。 我建议您使用onStart()来处理数据绑定。

您应该看到开发页面Android Activity life cycle

(更新):

因为在单击列表项上的搜索按钮时加载listContent ,所以必须维护活动中的数据以从中重建列表(例如:搜索字符串)。 然后在onStart()您可以从此数据重建列表。

但是,单击List的项目以更改整个List本身时,您的逻辑很奇怪。 请注意:单击列表项上的按钮时,也会触发onListItemClick(..) 。

您必须覆盖onSaveInstanceState和onRestoreInstanceState

在onSaveInstanceState保存Bundle上的ListView列表。

在onRestoreInstanceState ,使用Bundle还原列表并重新创建适配器。

private ArrayListdata; @Override protected void onSaveInstanceState(Bundle outState) { outState.putSerializable("d", data); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { if (savedInstanceState != null) { data = (ArrayList) savedInstanceState.getSerializable("d"); ListViewAdapter adapter = new ListViewAdapter(this, data); ListView listView = (ListView) findViewById(R.id.layout_listview); listView.setAdapter(adapter); } super.onRestoreInstanceState(savedInstanceState); }

当您进行方向更改时,您将不得不重做查询(如果不保存它),因为完成此操作后,将再次调用oncreate。

您可以尝试存储列表视图中的数据,例如共享首选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值