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

时间:2012-08-29 10:45:49

标签: android listview android-activity

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

我该怎么办?

5 个答案:

答案 0 :(得分:7)

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

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

这对我有用。

答案 1 :(得分:5)

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

求解器A:

  1. 清单xml 文件中添加 android:configChanges="orientation|keyboardHidden"
  2. 删除 onConfigurationChanged(Configuration newConfig)功能。
  3. 因为每次初始化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)

您必须覆盖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);
}

答案 4 :(得分:-1)

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

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