在Intent片段中获取可序列化的ArrayList

19

在我的片段中,我希望获取 ArrayList<Animal>。我已经创建了一个 newInstance 函数。

  companion object {
    private val ARG_TITLE = "ARG_TITLE"
    private val ARG_ANIMALS = "ARG_ANIMALS"

    fun newInstance(title: String,animals: ArrayList<Animal>): ExampleFragment{
        val fragment = ExampleFragment()
        val args = Bundle()
        args.putString(ARG_TITLE, title)
        args.putSerializable(ARG_ANIMALS, animals)
        fragment.arguments = args
        return fragment
    }
}

在我的onCreate()中,我有这个。

 private var title: String = ""
lateinit private var animals:ArrayList<Animal>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (arguments != null) {
        title = arguments.getString(ARG_TITLE)
        animals = arguments.getSerializable(ARG_ANIMALS)
    }
}

但是

需要:找到序列化的 ArrayList!

也不能将其转换为 ArrayList。


你试过将它强制转换为(ArrayList<Animal>)吗? - Reaz Murshed
是的,animals = arguments.getSerializable(ARG_ANIMALS) as ArrayList<Animal> - Aris Guimerá
确保Animal类已经实现了Serializable接口。 - Adeel Turk
错误出现在哪一行? - Zoe stands with Ukraine
我认为 args.putSerializable(ARG_ANIMALS, animals as Serializable) 应该可以工作! - Palak Jain
4个回答

32

正如在评论中提到的,将其强制转换:

注意:如果它是ArrayList(这意味着ArrayList - List和MutableList受到不同的影响),则不需要将其强制转换为Serializable。必须将List和MutableList强制转换为Serializable(否则会显示“不兼容的类型”错误)。

args.putSerializable(ARG_ANIMALS, animals as Serializable) //This is to cast it to the appropriate form in order for it to be serialized properly

并在输出上进行镜像:

在这里强制转换是必要的,无论如何。否则,您将只获得一个可序列化的类,而不是您已序列化的类。

animals = arguments.getSerializable(ARG_ANIMALS) as ArrayList<Animal>

钻石操作符中需要指定类型,否则会出现错误,因为 animals: ArrayList<Animal> 无法匹配 ArrayList<*>

您可能希望考虑使用 List 而不是 ArrayList,以通用化所接受的类型(例如包括 MutableList)。

这仅在 Animal 实现了 Serializable 的情况下才有效。否则,当您从 Bundle 中获取/放置列表时,它将崩溃。只有包含可序列化类的列表才可序列化。


当将animals传递给putSerializable时,为什么需要将其转换为Serializable?您能否再解释一下? - SpaceBison
@SpaceBison 说实话,当我进行测试时,我使用了 List 和 MutableList。显然,对于 ArrayList 来说这是不必要的,但对于 List 和 MutableList,它必须被转换为 Serializable。 - Zoe stands with Ukraine
1
我明白了。这是因为ArrayList实现了Serializable,但ListMutableList没有继承它,所以它们需要一个显式转换。 :) - SpaceBison
它们仍然可以被序列化,只要它所持有的类是可序列化的。但这似乎是正确的 :) - Zoe stands with Ukraine

1

使用以下代码可以在intent fragment中获取ArrayList。这段代码适用于Serializable和非Serializable的Object类型的ArrayList。

//first add this dependency in app build.gradle file
compile 'com.google.code.gson:gson:2.8.0'


//to send the arraylist contains elements of object type.
ArrayList<Object> mOrderList=new ArrayList();
//suppose this list now contains some data like number of objects.
Fragment fragment new YourFragment();
Bundle bundle=new Bundle();
Gson gson = new Gson();
String jsonDetails = gson.toJson(mOrderList);
bundle.putString(IntentKeyConstants.TAG_ORDER_LIST, jsonDetails);
fragment.setArguments(bundle);
FragmentTransaction fragmentTransaction=getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment, CURRENT_TAG);
fragmentTransaction.addToBackStack(CURRENT_TAG);
fragmentTransaction.commit();


//to get the arraylist contains the element of object type in fragment
ArrayList<Object> mOrderList=new ArrayList();
Gson gson=new Gson();
String jsonDetails;  
jsonDetails=getArguments().getString(IntentKeyConstants.TAG_ORDER_LIST);
Type type=new TypeToken<ArrayList<SuggestionResponseBean>>(){}.getType();
mOrderList=gson.fromJson(jsonDetails,type);

我希望这个解决方案能够帮到你。 谢谢


0
尝试将片段中获取的参数转换为您想要的ArrayList: 很可能这对您有用:
例如。
"ARRAYLIST_OBJECT"= arguments.getSerializable("ARGUMENT_NAME") as ArrayList<"ARRAYLIST_NAME">

谢谢。


你不能将字符串用作类型参数,也不能以这种方式进行强制转换,也不能像这样使用“as”。 - Nick Cardoso
这是一个示例,表明您必须在此处编写对象。请明确说明。它的文学指定为ARRAYLIST_OBJECT,请仔细阅读答案。 - Sagar
2
“它文学上指定的ARRAYLIST_OBJECT”一点意义也没有,你没有理由将其写成字符串 - 即使他更正了字符串,那段代码也是无意义的 - 甚至作为伪代码也毫无意义。这个答案唯一能做到的就是浪费新手在Java中迷失方向的时间。 - Nick Cardoso
如果您有其他想法,请发布出来,我们会从中学习 :) 没有自我。 - Sagar

0
你需要让你的Animal类实现Serializable接口,并使用下面的代码将数据存储在bundle中。
args.putSerializable(ARG_ANIMALS, animals)

为了在另一个片段中获取数据,可以按如下方式操作:
animals = arguments.getSerializable(ARG_ANIMALS)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接