我试图自己解决,但我不能。
我想从一个活动中的片段中保存Arraylist中的状态。基本上,它是一个JSON,它通过PHP脚本填充ListFragment中的List。然后,单击的项目将从单击的项目中发送名称和详细信息。
最后,当用户按下按钮"添加到购物车"时,这些数据将转到同一活动的第三个片段中的Arraylist。
代码:
PedidosFragment.java
package com.example.waitersoriginal;
*some imports*
public class PedidosFragment extends ListFragment{
public ArrayList<HashMap<String, String>> listaPedidos;
private static final String TAG_NM = "NOME";
private static final String TAG_DS = "DESCR";
ListAdapter adapter2;
public PedidosFragment(){}
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//abc = savedInstanceState;
super.onCreate(savedInstanceState);
restore(savedInstanceState);
listaPedidos = new ArrayList<HashMap<String, String>>();
adapter2 = new SimpleAdapter(getActivity(), listaPedidos,
R.layout.list_item,
new String[] { TAG_NM, TAG_DS},
new int[] { R.id.name, R.id.pid});
setListAdapter(adapter2);
return inflater.inflate(R.layout.pedidos_fragment, container, false);
}
void criaArray(String nomeProd, String descrProd) {
HashMap<String, String> map3 = new HashMap<String, String>();
map3.put(TAG_NM, nomeProd);
map3.put(TAG_DS, descrProd);
listaPedidos.add(map3);
//getListView();
((BaseAdapter) adapter2).notifyDataSetChanged();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("listaPedidos", listaPedidos);
}
private void restore(Bundle savedInstanceState) {
if (savedInstanceState != null) {
listaPedidos = (ArrayList<HashMap<String,String>>) savedInstanceState.getSerializable("listaPedidos");
}
}
}
当我离开实际活动并再次进入时,Arraylist已经消失了。我究竟做错了什么 ?
编辑:
使用给出的建议更改onCreateView:
public PedidosFragment(){}
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//abc = savedInstanceState;
super.onCreate(savedInstanceState);
listaPedidos = new ArrayList<HashMap<String, String>>();
restore(savedInstanceState);
adapter2 = new SimpleAdapter(getActivity(), listaPedidos,
R.layout.list_item,
new String[] { TAG_NM, TAG_DS},
new int[] { R.id.name, R.id.pid});
setListAdapter(adapter2);
return inflater.inflate(R.layout.pedidos_fragment, container, false);
}
答案 0 :(得分:1)
您正在使用新列表覆盖已恢复的列表。将您的调用移至要实例化listaPedidos的行下方恢复:
listaPedidos = new ArrayList<HashMap<String, String>>();
restore(savedInstanceState);
但是,正如其评论中提到的@DuZi一样,销毁活动不会保存实例状态。来自Android文档:
当您的活动被销毁时,因为用户按下后退或 活动完成了自己,该活动的系统概念 实例永远消失,因为行为表明了活动 不再需要了。但是,如果系统破坏了应付的活动 系统约束(而不是正常的应用程序行为),然而 实际的Activity实例消失了,系统会记住它 存在,如果用户导航回它,系统会创建 使用一组已保存数据的活动的新实例 描述活动被销毁时的状态。保存了 系统用于恢复先前状态的数据称为 &#34;实例状态&#34;并且是存储在a中的键值对的集合 捆绑对象。
所以,你需要处理保存和放大自己加载这些数据。您可以将可序列化对象放入字符串首选项中,如下所示:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
Editor editor = prefs.edit();
try {
editor.putString("listaPedidos", ObjectSerializer.serialize(listaPedidos));
} catch (IOException e) {
e.printStackTrace();
}
editor.commit();
然后重新加载数据:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
try {
listaPedidos= (ArrayList<HashMap<String, String>>) ObjectSerializer.deserialize(prefs.getString("listaPedidos", ObjectSerializer.serialize(new ArrayList<HashMap<String, String>>())));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
您可以从Apache Pig项目中获取ObjectSerializer类:ObjectSerializer.java