Я думаю, что делаю это неправильно, но это моя ситуация.
Я получаю данные json внутри фрагмента, затем обрабатываю их с помощью Gson в классе данных и отображаю их. Что мне нужно, так это снова использовать эти данные внутри другого фрагмента в пользовательском адаптере счетчика, который готов.
Я так понимаю нельзя передавать объекты так как же мне это сделать!? Я пытался использовать пакет, и это не сработало
метод onResponse (первый фрагмент)
override fun onResponse(call: Call?, response: Response?) {
val jsonString = response?.body()?.string()
val gson = GsonBuilder().create()
val data = gson.fromJson(jsonString,currancyModel::class.java)
countryData = data
activity?.runOnUiThread {
rootView.recyclerView.adapter = CountryAdapter(data)
}
}
класс данных
data class currancyModel(val items: List<Item>)
data class Item(val countray :String,val rate:String)
getView в пользовательском адаптере счетчика внутри второго фрагмента (мне нужны мои данные здесь)
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
val view = inflater.inflate(R.layout.custome_spinner,null)
val img = view.findViewById<View>(R.id.spinner_image) as ImageView
val countary_name = view.findViewById<View>(R.id.spinner_country) as TextView
img.setImageResource(R.drawable.us)
countary_name.setText(country!![p0].countray)
return view
}
вы можете использовать интерфейс или проверить с ViewModel для связи между фрагментами developer.android.com/topic/libraries/architecture/… или вы можете проверить передачу пакета в качестве аргумента в соответствии с вашим требованием
Идея может состоять в том, чтобы использовать одноэлементный класс данных с HashMap<String, Object>, имеющим ключ с каким-то идентификатором, который вы создаете сами, а затем значением является объект, который вы хотите получить. Таким образом, в onResponse вы добавите свои данные в HashMap в классе данных, а затем просто получите их из другого класса.
Вы показываете два фрагмента в Activity одновременно? Если это так, вы можете передать данные через него. Или реализовать некоторый интерфейс/наблюдаемые/живые данные для передачи данных между фрагментами.
Если Fragment A извлекает данные, а затем вы меняете Fragment A на Fragment B, создайте свои классы данных Parcelable и затем передайте их в качестве аргументов при создании Fragment B:
companion object {
fun newInstance(yourData : DataClass) = FragmentB().apply { arguments = Bundle().apply { putParcelable("dataKey",yourData) }
}
Примечание: вы можете аннотировать свой класс данных с помощью @Parcelize. Затем компилятор сгенерирует для вас все методы Parcelable и фабричный класс.
После того, как вы передали данные в Fragment B при создании, извлеките их, например:
val data: YourData by lazy { arguments?.getParcelable("dataKey") as YourData }
два фрагмента не находятся на одном дисплее, поэтому это второй сценарий, большое спасибо, еще один вопрос! как вы можете видеть, у меня есть два класса данных, один из которых содержит список другого, в каком из них я должен реализовать Parcelable?
Вам следует рассмотреть возможность передачи только items: List<Item> из data class currancyModel. Поскольку коллекция List не может быть разделена сама по себе, вам нужно передать ее как типизированный массив. Используйте putParcelableArray(key, list.toTypedArray), затем извлеките его с помощью arguments?.getParcelableArray().
что-то не так, я сделал все, как вы сказали, но я всегда получаю значение null в переменной данные, в соответствии с вашим примером данные должны передаваться из фрагмента A, например, `FirstFragment.newInstance(data)` внутри вышеуказанного метода onResponse? ! Правильно ?
Вы изменили тип data на Array<Item>?
да, я так и сделал, я только что понял, что проблема в том, что Фрагмент Б запускается до Фрагменты А, поэтому при попытке получить значение с помощью partitionabl в Фрагменты Б оно становится нулевым, потому что Фрагменты А еще не поместил значение
Действительно, можно передавать объекты из одного фрагмента в другой, если ваш класс объектов должен реализовывать Parcelable. И передать объект через пакет, вызвав putParcelable для объекта пакета.
1. class CurrancyModel : Parcelable {
//Implement Parcelable
}
И передать его между фрагментами через Bundle.
2.var fragment = YourFragment().apply {
arguments = Bundle().apply{ putParcelable("dataKey",yourData) }
}
Эта работа для меня после реализации моего класса данных с разделяемыми, с ними я могу передавать разделяемые данные между фрагментами, используя putParcelable(), спасибо
Передача объектов через
Bundleневозможна. В этом случае вы можете использоватьParcelable. Подпишитесь на stackoverflow.com/questions/16036572/….