Reputation: 166
I think I'm doing it wrong but this is my situation.
I'm getting json data inside a fragment then process it with Gson to a data class and display it. What I need is to use this data again inside another fragment in a custom spinner adapter which is ready.
As much as I understand it's impossible to pass objects so how can I do this !? I have tried to use bundle and it didn't work
the onResponse method (First fragment)
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)
}
}
the data class
data class currancyModel(val items: List<Item>)
data class Item(val countray :String,val rate:String)
the getView in the custom spinner adapter inside the second fragment (I need my data here)
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
}
Upvotes: 3
Views: 5897
Reputation: 4074
Indeed it is possible to pass objects from one fragment to another given your object class should implement Parcelable. And passing the object through the bundle by calling putParcelable on the bundle object.
1. class CurrancyModel : Parcelable {
//Implement Parcelable
}
And pass it between the fragments via Bundle.
2.var fragment = YourFragment().apply {
arguments = Bundle().apply{ putParcelable("dataKey",yourData) }
}
Upvotes: 2
Reputation: 559
An idea could be to use a singleton data class, with a HashMap<String, Object>
having a key with some kind of ID you create yourself, and then the value being the object you want to be able to retrieve. So in the onResponse
you will add your data to the HashMap
in the dataclass and then just retrieve it from the other class.
Upvotes: -1
Reputation: 395
Do you display two fragments in your Activity
simultaneously? If so, you can pass the data through it. Or implement some interface/observable/livedata to pass the data between the fragments.
If Fragment A
fetches the data and then you change Fragment A
to Fragment B
, make your data classes Parcelable
and then pass it as arguments when creating Fragment B
:
companion object {
fun newInstance(yourData : DataClass) = FragmentB().apply { arguments = Bundle().apply { putParcelable("dataKey",yourData) }
}
Note: you can annotate your data class with @Parcelize
. Compiler will then generate all Parcelable
methods and factory class for you.
After you passed the data to Fragment B
on creation, retrieve it with, for example:
val data: YourData by lazy { arguments?.getParcelable("dataKey") as YourData }
Upvotes: 3