如何在屏幕旋转中保存自定义ListView中的所有项目及其状态?

时间:2013-11-26 14:29:32

标签: android listview

我有一个由BaseAdapter填充的ListView。

此ListView中的项目是复选框,最后一项是TextView和Button,允许用户在此列表中添加新复选框。 (其中四个是预定义的,来自ArrayList,当用户点击列表中的按钮时,他可以通过DialogBox将新项目添加到列表中,这个新项目也是一个CheckBox)

我注意到当屏幕方向发生变化时, new CheckBoxes 以及之前的状态都会丢失。

我读到了活动生命周期并发现了这种情况。我还读到了 onSaveInstanceState onRestoreInstanceState 方法可以用来保存有关Bundle中活动的信息,然后用它来恢复所有内容。

然而,我无法想出一种方法来保存有关州和州的所有信息。旧CheckBoxes&新的CheckBoxes以及如何添加我的上一个项目的信息,即TextView和Button。

感谢。

3 个答案:

答案 0 :(得分:0)

使用ListFragment而不是ListView。

将片段告诉setRetainInstance然后重新挂接片段,而不是在切换方向时创建新片段。

如果使用此方法,当他说你不能使用配置更改时,Sam_D是不正确的。 getView仍然正常调用,之后您可以将列表视图恢复到您需要的状态(假设您将适配器保留在片段内的私有字段中)

答案 1 :(得分:0)

尝试覆盖活动中的onRetainCustomNonConfigurationInstance。在你的onCreate()中使用getLastCustomNonConfigurationInstance()来获取保存的对象..

见下面的代码供参考......

@Override
        public Object onRetainCustomNonConfigurationInstance() {
            //stop = true;
           // if (pd != null) pd.dismiss();
            List l = new ArrayList();           
            if(yourColl !=null)
            {
                l.add(rezColl);
            }
            l.add(true); // save boolean
            return l;
        }



and in oncreate() 

List al = (ArrayList) getLastCustomNonConfigurationInstance();
if(al!=null){
   Iterator itr=al.iterator();
   while(itr.hasNext())
   {
    try{
    Object o=itr.next();                    
    if(o instanceof ArrayList)
    {
       yourColl=(ArrayList<HashMap<String, String>>)o;
    }
    if(o instanceof Boolean)
    {
      //do something
    }
     }catch(Exception e){
    e.printStackTrace();
   }
 }
}

答案 2 :(得分:-1)

setRetainInstance可能很有用,但我尝试永远不会将Fragment(或ListFragment)用于公开View。这样做本质上是告诉你的Fragment忽略配置更改,例如方向更改(还有很多其他...),这意味着你无法利用资源文件中的配置限定符来实现Fragment 1}}(例如,横向与纵向具有不同的布局xml)。

当用户与UI交互时(即检查可以用布尔表示的复选框),改变最初用于填充适配器的数组会更好,为每个项创建类似包装类的东西。在onSaveInstanceState期间保存该数组,然后在Fragment重新启动时重新填充适配器。当然这有点烦人,因为你的类/数组必须实现Parcelable接口 - 但是一个简单的方法就是使用Gson将它序列化为String库,同样也使用Gson将其反序列化为数组。