Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';无法在片段上保存Arraylist状态_Android_Json_Android Fragments_Arraylist_State - Fatal编程技术网

Android Can';无法在片段上保存Arraylist状态

Android Can';无法在片段上保存Arraylist状态,android,json,android-fragments,arraylist,state,Android,Json,Android Fragments,Arraylist,State,很抱歉提出另一个问题 我试着自己解决,但我做不到 我想从活动中的片段保存Arraylist中的状态。基本上,它是一个JSON,通过PHP脚本填充ListFragment中的列表。然后,单击的项目发送单击项目的名称和详细信息 最后,当用户点击“添加到购物车”按钮时,这些数据将在同一活动中进入第三个片段中的Arraylist 守则: peddosfragment.java package com.example.waitersoriginal; *some imports* public cla

很抱歉提出另一个问题

我试着自己解决,但我做不到

我想从活动中的片段保存Arraylist中的状态。基本上,它是一个JSON,通过PHP脚本填充ListFragment中的列表。然后,单击的项目发送单击项目的名称和详细信息

最后,当用户点击“添加到购物车”按钮时,这些数据将在同一活动中进入第三个片段中的Arraylist

守则:

peddosfragment.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"); 
        }
    }

}
package com.example.waitersoriginal;
*一些进口商品*
公共类片段扩展了ListFragment{
公共ArrayList listaPedidos;
专用静态最终字符串标记\u NM=“NOME”;
私有静态最终字符串标记\u DS=“DESCR”;
列表适配器适配器2;
公共片段(){}
@覆盖CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{ 
//abc=保存状态;
super.onCreate(savedInstanceState);
恢复(savedInstanceState);
listaPedidos=newarraylist();
adapter2=新的SimpleAdapter(getActivity(),listaPedidos,
R.layout.list_项目,
新字符串[]{TAG_NM,TAG_DS},
新的int[]{R.id.name,R.id.pid});
setListAdapter(适配器2);
返回充气机。充气(R.layout.pedidos_碎片,容器,假);
}
void criaArray(字符串名称、字符串描述){
HashMap map3=新的HashMap();
map3.put(标签号:NM,nomeProd);
map3.put(标签、说明);
添加(map3);
//getListView();
((BaseAdapter)adapter2.notifyDataSetChanged();
}   
@凌驾
SaveInstanceState上的公共无效(束超出状态){
super.onSaveInstanceState(超出状态);
可串行化(“listaPedidos”,listaPedidos);
}
私有无效恢复(捆绑包savedInstanceState){
如果(savedInstanceState!=null){
listaPedidos=(ArrayList)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); 
    }
public-peddosfragment(){}
@覆盖CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{ 
//abc=保存状态;
super.onCreate(savedInstanceState);
listaPedidos=newarraylist();
恢复(savedInstanceState);
adapter2=新的SimpleAdapter(getActivity(),listaPedidos,
R.layout.list_项目,
新字符串[]{TAG_NM,TAG_DS},
新的int[]{R.id.name,R.id.pid});
setListAdapter(适配器2);
返回充气机。充气(R.layout.pedidos_碎片,容器,假);
}

您正在用新列表覆盖恢复的列表。将还原调用移动到实例化listaPedidos的行下方:

listaPedidos = new ArrayList<HashMap<String, String>>();
restore(savedInstanceState);
然后像这样重新加载数据:

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();
}
SharedReferences prefs=PreferenceManager.GetDefaultSharedReferences(getActivity());
试一试{
listaPedidos=(ArrayList)ObjectSerializer.deserialize(prefs.getString(“listaPedidos”,ObjectSerializer.serialize(new ArrayList()));
}捕获(IOE异常){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}

您可以从ApachePig项目中获得ObjectSerializer类:

离开是什么意思?按“后退”按钮?如果您想在“活动”中调用了
onestroyed
后仍保留项目,则必须将其保存在设备上。您可以使用首选项、sqlite数据库或对象序列化来完成此操作。谢谢,@DuZi!但是,我不是在处理对象序列化吗?谢谢你的回答,@justinpowell!我已经按照你的建议做了,但是,当我按下后退按钮并再次进入活动时,arraylist仍然会更新。。你有什么建议吗?我已经这样做了(问题编辑)谢谢你和@DuZi的帮助!!我是android开发的新手,所以我对实现这段代码有点困惑。。我已经创建了一个类ObjectSerializer。。我也可以创建PreferenceManager吗?很抱歉这个愚蠢的问题,谢谢!不,ObjectSerializer和PreferenceManager已经存在,您只需要导入它们以在代码中使用。哦。。电话里有我需要的演员吗?因为Eclipse在SharedPreferences=PreferenceManager.getDefaultSharedPreferences(此)行中给出了一个错误;(错误:类型首选项管理器中的方法GetDefaultSharedReferences(ConText)不适用于参数(PedidosFragment))和行编辑器.putString(“listaPedidos”,ObjectSerializer.serialize(listaPedidos));错误(ObjectSerializer无法解决)…很抱歉,ObjectSerializer不是本机Android。查看我的更新。另外,
这只是一个上下文,您可以从片段中使用
getActivity()