Получить Serializable ArrayList на фрагменте Intent

На моем фрагменте я хочу получить 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 найден Serialized!

Невозможно передать в ArrayList.

Ответы

Ответ 1

Как упоминалось в комментарии, бросьте его:

ПРИМЕЧАНИЕ. Приведение в режим Serializable необязательно, если это ArrayList (это означает, что ArrayList List и MutableList затронуты по-разному).List и MutableList должны быть 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

и зеркалировать его на выходе:

Кастинг здесь необходим независимо от того, что.В противном случае вы просто получите Serializable, а не класс, который вы сериализовали.

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

Тип должен быть указан в алмазе, иначе вы получите ошибку в результате animals: ArrayList<Animal> не соответствует ArrayList<*>

Возможно, вы захотите изучить List вместо ArrayList, чтобы обобщать типы, которые вы принимаете (включая MutableList для экземпляра).

И это работает только в том случае, если Animal реализует Serializable. В противном случае это сработает, когда вы положите/получите список из пакета. Списки только сериализуемы, если класс в них тоже.

Ответ 2

Получить ArrayList на фрагмент намерения делается с помощью этой строки кода. И этот код работает как для Serializable, так и для несериализуемого ArrayList типа Object.

//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);

Надеюсь, это решение вам поможет. Спасибо

Ответ 3

Вы должны сделать свой класс Animal Serializable и использовать ниже код для установки данных в комплекте

args.putSerializable(ARG_ANIMALS, animals)

Чтобы получить данные в другом фрагменте, как показано ниже

animals = arguments.getSerializable(ARG_ANIMALS)

Ответ 4

Попробуйте аргумент каста, который вы получите в фрагменте в arraylist, который вы хотели: скорее всего, это сработает для вас:

например.

"ARRAYLIST_OBJECT"= arguments.getSerializable("ARGUMENT_NAME") as ArrayList<"ARRAYLIST_NAME">

Спасибо.