10

在我的布局上,我有一些按钮可以做出一些选择,然后是一个按钮来执行对数据库的查询。此查询的结果显示在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);

    }

}   

这也会对数据库执行查询,将其显示在 a 上ListView,然后处理用户选择。如果我旋转屏幕,ListView仍然显示。

我能做些什么?

4

5 回答 5

9

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

<activity
...
...
android:configChanges="orientation|screenSize|keyboard">
</activity

这对我有用。

于 2015-12-29T17:23:43.943 回答
5

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

求解器 A:

  1. 添加 android:configChanges="orientation|keyboardHidden"清单xml文件。
  2. 删除 onConfigurationChanged(Configuration newConfig)功能。

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

求解器 B:

您在 onCreate() 中编写的数据绑定代码移动覆盖方法onStart()onResume(). 我建议您使用onStart()数据绑定的情况。

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

(更新):

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

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

于 2012-08-29T11:37:50.403 回答
3

当您在 onConfigurationChanged 方法中执行 setContentView 时,会重新创建 ListView。您需要再次将数据加载到 ListView 中。如果要将 ListView 绑定到适配器,则需要在 onConfigurationChanged 中进行。

于 2012-08-29T11:17:57.487 回答
2

您必须覆盖onSaveInstanceStateonRestoreInstanceState

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);
}
于 2014-04-04T01:05:47.507 回答
-1

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

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

于 2012-08-29T10:56:21.223 回答