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。

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

回答:

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

求解答:

  1. 添加android:configChanges="orientation|keyboardHidden"在清单XML文件。
  2. REMOVEonConfigurationChanged(Configuration newConfig)功能。

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

求解B:

移动数据绑定代码已被写入的onCreate()到压倒一切的方法onStart()onResume()。我建议您使用onStart()来处理数据绑定。

你应该会看到开发页Android Activity life cycle

(更新):

因为你点击列表条目的搜索按钮时加载listContent,所以你必须保持活动中的数据以重建从它的列表(例如:一个搜索字符串)。然后在onStart()中,您从这些数据重建您的列表。

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

回答:

你必须重写onSaveInstanceStateonRestoreInstanceState

onSaveInstanceState保存在BundleListView列表。

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

回到顶部