16

我正在尝试在活动之间传递 LinkedHashMap,我的代码是这样的

活动一

LinkedHashMap mLinkedHashMap = new LinkedHashMap<String, Object>();
// setting data in map
Bundle bundle = new Bundle();
bundle.putSerializable("OBJECTS_LINKED_HASHMAP", mLinkedHashMap);  
Intent intent = new Intent(this, ActivityB.class); 
intent.putExtras(bundle);
startActivity(intent);

在活动中,当我收到捆绑对象时,我收到“类转换异常”错误消息

活动 B

Bundle bundle = this.getIntent().getExtras();
LinkedHashMap mLinkedHashMap = new LinkedHashMap<String, Object>();
mLinkedHashMap = (LinkedHashMap<String, Object>) bundle.getSerializable("OBJECTS_LINKED_HASHMAP");

获取类转换异常

ClassCastException: java.util.HashMap cannot be cast to LinkedHashMap

我检查了文档 LinkedHashMap 也实现了 Serializable 接口。

我使用 LinkedHashMap 是因为我想维护对象顺序,他们插入的方式我想按顺序返回。

如何在活动之间传递 LinkedHashMap?

4

5 回答 5

22

尝试GSON改变:)

从此链接下载 gson.jar

并在您的项目中添加 gson-2.2.2.jar 文件。
现在使用 GSON 将您的 LinkedHashMap 传递给另一个活动

像这样(根据您的需要修改下面的代码):

主要活动:::

public class MainActivity extends Activity {
    ObjectClass obj=new ObjectClass();
    LinkedHashMap<String, ObjectClass> mLinkedHashMap = new LinkedHashMap<String, ObjectClass>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        obj.id=1;
        obj.name="hello";

        mLinkedHashMap.put("test", obj);

        Gson gson = new Gson();
        String list = gson.toJson(mLinkedHashMap); 
        Intent intent = new Intent(this, secondActivity.class); 
        intent.putExtra("list", list);
        startActivity(intent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

第二活动:::

public class secondActivity extends Activity {
    LinkedHashMap<String, ObjectClass> mLinkedHashMap = new LinkedHashMap<String, ObjectClass>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     String str=  getIntent().getStringExtra("list");
     Gson gson = new Gson();

     Type entityType = new TypeToken< LinkedHashMap<String, ObjectClass>>(){}.getType();
     mLinkedHashMap = gson.fromJson(str, entityType);
    ObjectClass obj = mLinkedHashMap.get("test");

     Log.i("list", ""+obj.id);
    }
}

为我工作。希望这会有所帮助。

这是我的对象类供参考。

public class ObjectClass {

    public int id;
    public String name;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


}

如何添加 gson-2.2.2.jar 文件。

1) 从下载的文件夹 "google-gson-2.2.2" 复制您的 gson-2.2.2.jar 。
2)将其粘贴到项目的资产文件夹中。
3)现在通过右键单击您的项目>构建路径>配置构建路径进入您的项目构建路径。
4)它将打开一个对话框,从右侧菜单中选择java构建路径并转到库标签,然后
单击“添加罐子。 .." 按钮,如下图所示
,它将打开另一个对话框来添加 jar。这里选择我们在项目资产文件夹中添加的 gson-2.2.2.jar(步骤 2)。
它会将 jar 添加到您的项目中(我已经在我的项目中添加了它,如下图所示)

在此处输入图像描述 5)现在选择 Order 和 Export 标签并选择您的 gson-2.2.2.jar(见下图)。
在此处输入图像描述GSON

于 2013-02-16T07:33:09.977 回答
4

LinkedHashMap<> 不是 Parcelable 或 Serializable

编辑 :

检查这个:

序列化/反序列化 LinkedHashMap (android) java

于 2013-02-16T06:08:03.560 回答
3

编辑:

根据 Manish Android 提供的链接,解决方案是

  if (getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP") != null)
                HashMap<?, ?>   user_info = (HashMap<?, ?>) getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP");


    LinkedHashMap<String, Object>   userdata= (LinkedHashMap<String, Object>) user_info

你需要得到这样的

if (getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP") != null)
        LinkedHashMap<String, Object>   user_info = (LinkedHashMap<String, Object>) getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP");
于 2013-02-16T06:09:08.523 回答
0

我的方法如下:

CustomObject 必须实现 Parcelable。要设置捆绑包:

    LinkedHashMap<Integer, List<CustomObject>> mItems

    Bundle bundle = new Bundle();

    bundle.putInt("ItemsSize",mItems.size());          
    int mapIndex=0;

for(Map.Entry<Integer, List<CustomObject>> entry : mItems.entrySet()) {
    int key = entry.getKey();
    bundle.putInt("Key"+mapIndex, key);
    bundle.putParcelableArrayList("Value"+mapIndex, mItems.get(key));
    mapIndex++;
}

要获取捆绑包:

for(int i=0;i<bundle.getInt("ItemsSize");i++) {
    int key = bundle.getInt("Key"+i);
    ArrayList<CustomObject> value = bundle.getParcelableArrayList("Value"+i);
    mItems.put(key, value);
}
于 2018-04-22T23:34:18.253 回答
0

作为字节数组传递,然后反序列化并转换为 LinkedHashMap目标 Activity。

于 2015-11-26T17:33:33.133 回答