Получить 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">
Спасибо.