在两个片段之间传递数据类

时间:2019-02-07 10:21:43

标签: android android-fragments kotlin

我认为我做错了,但这是我的情况。
我正在片段中获取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
}

3 个答案:

答案 0 :(得分:2)

实际上,考虑到您的对象类应该实现Parcelable,可以将对象从一个片段传递到另一个片段。并通过调用bundle对象上的putParcelable将对象传递通过bundle。

1. class CurrancyModel : Parcelable {
  //Implement Parcelable 
}

并通过Bundle在片段之间传递它。

2.var fragment = YourFragment().apply {
   arguments = Bundle().apply{ putParcelable("dataKey",yourData) }
}

答案 1 :(得分:1)

  1. 您是否同时在Activity中显示两个片段?如果是这样,您可以通过它传递数据。或实现一些接口/可观察/实时数据以在片段之间传递数据。

  2. 如果Fragment A获取数据,然后将Fragment A更改为Fragment B,则将数据类设置为Parcelable,然后在创建{{ 1}}:

Fragment B

注意:您可以使用companion object { fun newInstance(yourData : DataClass) = FragmentB().apply { arguments = Bundle().apply { putParcelable("dataKey",yourData) } } 注释数据类。然后,编译器将为您生成所有@Parcelize方法和工厂类。

在创建后将数据传递给Parcelable后,使用例如

进行检索。

Fragment B

答案 2 :(得分:0)

一个想法可能是使用单例数据类,其中一个HashMap<String, Object>具有一个密钥,该密钥带有您自己创建的某种ID,然后该值是您希望能够检索的对象。因此,在onResponse中,将数据添加到数据类的HashMap中,然后从另一个类中检索它即可。