无法在片段上保存Arraylist状态

时间:2014-10-26 17:04:50

标签: android json android-fragments arraylist state

抱歉提出另一个问题。

我试图自己解决,但我不能。

我想从一个活动中的片段中保存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); 
    }

1 个答案:

答案 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

相关问题