Передать класс данных между двумя фрагментами

Я думаю, что делаю это неправильно, но это моя ситуация.
Я получаю данные 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
}

Передача объектов через Bundle невозможна. В этом случае вы можете использовать Parcelable. Подпишитесь на stackoverflow.com/questions/16036572/….

ADM 07.02.2019 11:31

вы можете использовать интерфейс или проверить с ViewModel для связи между фрагментами developer.android.com/topic/libraries/architecture/… или вы можете проверить передачу пакета в качестве аргумента в соответствии с вашим требованием

Pavan 07.02.2019 11:32
3
2
2 967
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Идея может состоять в том, чтобы использовать одноэлементный класс данных с HashMap<String, Object>, имеющим ключ с каким-то идентификатором, который вы создаете сами, а затем значением является объект, который вы хотите получить. Таким образом, в onResponse вы добавите свои данные в HashMap в классе данных, а затем просто получите их из другого класса.

Ответ принят как подходящий
  1. Вы показываете два фрагмента в Activity одновременно? Если это так, вы можете передать данные через него. Или реализовать некоторый интерфейс/наблюдаемые/живые данные для передачи данных между фрагментами.

  2. Если 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?

Wael Fadl Ãllåh 07.02.2019 12:40

Вам следует рассмотреть возможность передачи только items: List<Item> из data class currancyModel. Поскольку коллекция List не может быть разделена сама по себе, вам нужно передать ее как типизированный массив. Используйте putParcelableArray(key, list.toTypedArray), затем извлеките его с помощью arguments?.getParcelableArray().

Kuba Pawłowski 07.02.2019 12:56

что-то не так, я сделал все, как вы сказали, но я всегда получаю значение null в переменной данные, в соответствии с вашим примером данные должны передаваться из фрагмента A, например, `FirstFragment.newInstance(data)` внутри вышеуказанного метода onResponse? ! Правильно ?

Wael Fadl Ãllåh 07.02.2019 19:51

Вы изменили тип data на Array<Item>?

Kuba Pawłowski 07.02.2019 22:44

да, я так и сделал, я только что понял, что проблема в том, что Фрагмент Б запускается до Фрагменты А, поэтому при попытке получить значение с помощью partitionabl в Фрагменты Б оно становится нулевым, потому что Фрагменты А еще не поместил значение

Wael Fadl Ãllåh 07.02.2019 22:53

Действительно, можно передавать объекты из одного фрагмента в другой, если ваш класс объектов должен реализовывать Parcelable. И передать объект через пакет, вызвав putParcelable для объекта пакета.

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

И передать его между фрагментами через Bundle.

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

Эта работа для меня после реализации моего класса данных с разделяемыми, с ними я могу передавать разделяемые данные между фрагментами, используя putParcelable(), спасибо

Rafael Guimarães 22.04.2019 22:40

Другие вопросы по теме