我有一个由BaseAdapter填充的ListView。
此ListView中的项目是复选框,最后一项是TextView和Button,允许用户在此列表中添加新复选框。 (其中四个是预定义的,来自ArrayList,当用户点击列表中的按钮时,他可以通过DialogBox将新项目添加到列表中,这个新项目也是一个CheckBox)
我注意到当屏幕方向发生变化时, new CheckBoxes 以及之前的状态都会丢失。
我读到了活动生命周期并发现了这种情况。我还读到了 onSaveInstanceState 和 onRestoreInstanceState 方法可以用来保存有关Bundle中活动的信息,然后用它来恢复所有内容。
然而,我无法想出一种方法来保存有关州和州的所有信息。旧CheckBoxes&新的CheckBoxes以及如何添加我的上一个项目的信息,即TextView和Button。
感谢。
答案 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将其反序列化为数组。