将 LinkedHashMap 发送到意图

发布于 2024-10-01 13:55:58 字数 195 浏览 4 评论 0原文

我想将 LinkedHashMap 发送到另一个 Intent。但我不知道什么方法是允许的。

Bundle extras = getIntent().getExtras();
  LinkedHashMap<Integer, String[]> listItems = extras.get(LIST_TXT);

I want send LinkedHashMap to another Intent. But I don't known what method for extras is allowable.

Bundle extras = getIntent().getExtras();
  LinkedHashMap<Integer, String[]> listItems = extras.get(LIST_TXT);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦情居士 2024-10-08 13:55:58

您无法可靠地将 LinkedHashMap 作为 Intent extra 发送。当您使用 LinkedHashMap 调用 putExtra() 时,Android 会发现该对象实现了 Map 接口,因此它将名称/值对序列化为Intent 中的额外 Bundle。当你想在另一边提取它时,你得到的是一个HashMap,而不是一个LinkedHashMap。不幸的是,您获得的这个 HashMap 丢失了顺序,这正是您想要使用 LinkedHashMap 的首要原因。

唯一可靠的方法是将LinkedHashMap转换为有序数组,将数组放入Intent中,从Intent中提取数组> 在接收端,然后重新创建 LinkedHashMap

请参阅我的回答这个问题以获取更多血淋淋的细节。

You cannot reliably send a LinkedHashMap as an Intent extra. When you call putExtra() with a LinkedHashMap, Android sees that the object implements the Map interface, so it serializes the name/value pairs into the extras Bundle in the Intent. When you want to extract it on the other side, what you get is a HashMap, not a LinkedHashMap. Unfortunately, this HashMap that you get has lost the ordering that was the reason you wanted to use a LinkedHashMap in the first place.

The only reliable way to do this is to convert the LinkedHashMap to an ordered array, put the array into the Intent, extract the array from the Intent on the receiving end, and then recreate the LinkedHashMap.

See my answer to this question for more gory details.

只是在用心讲痛 2024-10-08 13:55:58

最好的方法是将其转换为相同类型的 ArrayList
例如:

 LinkedHashSet<Long> uniqueIds = new LinkedHashSet();
 ArrayList<Long> ids = new ArrayList(uniqueIds);
    
 Intent intent = new Intent(getContext(), UserStoryActivity.class);
 intent.putParcelableArrayListExtra(FLAG_USERS_STORY_LIST_IDS, (ArrayList) ids);
 startActivity(intent);

The best way is to convert it to ArrayList of the same type
examble :

 LinkedHashSet<Long> uniqueIds = new LinkedHashSet();
 ArrayList<Long> ids = new ArrayList(uniqueIds);
    
 Intent intent = new Intent(getContext(), UserStoryActivity.class);
 intent.putParcelableArrayListExtra(FLAG_USERS_STORY_LIST_IDS, (ArrayList) ids);
 startActivity(intent);
笑脸一如从前 2024-10-08 13:55:58

感谢@David Wasser 指出这个问题。

我有另一种方法是使用 Gson 将您的任何映射解析为 json 字符串,然后放入意图中。戏少了!

代码发送:

gson.toJson(data)

代码返回:

Kotlin:

gson.fromJson<LinkedHashMap<Int, Int>>(
                    it.getStringExtra(ARG_DATA),
                    object : TypeToken<LinkedHashMap<Int, Int>>() {}.type
                )

Java:

gson.fromJson(
     it.getStringExtra(ARG_DATA),
     new TypeToken<ArrayList<Mountain>>(){}.getType()
);

Thanks @David Wasser for pointing out this issue.

I have another approach is to use Gson to parse your whatever map to json string, then put into the intent. Less drama!

Code send:

gson.toJson(data)

Code get back:

Kotlin:

gson.fromJson<LinkedHashMap<Int, Int>>(
                    it.getStringExtra(ARG_DATA),
                    object : TypeToken<LinkedHashMap<Int, Int>>() {}.type
                )

Java:

gson.fromJson(
     it.getStringExtra(ARG_DATA),
     new TypeToken<ArrayList<Mountain>>(){}.getType()
);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文