Работа с Retrofit, фрагментами и ViewPager
Я пишу приложение с расписанием моего ВУЗа, расписание хранится на сервере в виде:
"numerator": [
[
{
"date": "6.11.2022"
"number": "1",
"name": "Название предмета",
"classroom": "326",
"group": "41201"
"start_time": "08:00",
"end_time": "09:25",
"lecturer": "_____ _____ _____",
"type": "Лекции дистант Математика Дистант"
} ... // Занятия
], ... // Дни недели по порядку
]
"denominator":[
[
{
"date": "15.11.2022"
"number": "1",
"name": "Название предмета",
"classroom": "",
"group": "41201"
"start_time": "08:00",
"end_time": "09:25",
"lecturer": "_____ _____ _____",
"type": "Лекции дистант Математика Дистант"
} ...
], ...
]
У меня есть активность ScheduleActivity, состоящая из TabLayout и ViewPager. На ViewPager - фрагменты для каждого дня недели, в этих фрагментах хранится расписание для того или иного дня. До изменений, на каждом фрагменте создавался Retrofit Builder и для каждого дня расписание с сервера запрашивалось именно в фрагменте. Я решил, что это нерационально и так "насиловать" сервер не нужно, поэтому пришел к выводу, что запрос нужно сделать единожды, при инициализации активности, а далее передавать полученный список в фрагменты. Так вот, вопрос, все ли правильно я сделал в коде?
package com.example.petrsushedule.Activities
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager
import com.example.petrsushedule.Adapter.ScheduleAdapter
import com.example.petrsushedule.Adapter.SchedulePagerAdapter
import com.example.petrsushedule.Fragments.MondayFragment
import com.example.petrsushedule.Fragments.TuesdayFragment
import com.example.petrsushedule.Fragments.WednesdayFragment
import com.example.petrsushedule.Interface.ScheduleApi
import com.example.petrsushedule.Interface.WeekApi
import com.example.petrsushedule.Model.ScheduleItem
import com.example.petrsushedule.Model.ScheduleResponse
import com.example.petrsushedule.Model.WeekResponse
import com.example.petrsushedule.R
import com.google.android.material.tabs.TabLayout
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class ScheduleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_schedule)
val tabLayout = findViewById<TabLayout>(R.id.tabLayout)
val viewPager = findViewById<ViewPager>(R.id.viewPager)
val adapter = SchedulePagerAdapter(supportFragmentManager)
val groupNumber = intent.getStringExtra("GROUP_NUMBER") ?: ""
var scheduleList: List<List<ScheduleItem>> = emptyList()
val retrofit = Retrofit.Builder()
.baseUrl("https://petrsu.egipti.com/api/v2/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val weekApi = retrofit.create(WeekApi::class.java)
val weekCall = weekApi.getCurrentWeek()
weekCall.enqueue(object : Callback<WeekResponse> {
override fun onResponse(call: Call<WeekResponse>, response: Response<WeekResponse>) {
if (response.isSuccessful) {
val weekResponse = response.body()
weekResponse?.let { week ->
val currentWeek = week.week
val scheduleApi = retrofit.create(ScheduleApi::class.java)
val scheduleCall = scheduleApi.getScheduleForGroup(groupNumber)
scheduleCall.enqueue(object : Callback<ScheduleResponse> {
override fun onResponse(
call: Call<ScheduleResponse>,
response: Response<ScheduleResponse>
) {
if (response.isSuccessful) {
val scheduleResponse = response.body()
scheduleResponse?.let {
scheduleList =
if (currentWeek == "numerator") {
scheduleResponse.numerator
} else {
scheduleResponse.denominator
}
val mondayFragment = MondayFragment(scheduleList[0])
val tuesdayFragment = TuesdayFragment(scheduleList[1])
val wednesdayFragment = WednesdayFragment(scheduleList[2])
adapter.addFragment(mondayFragment, "ПН")
adapter.addFragment(tuesdayFragment, "ВТ")
adapter.addFragment(wednesdayFragment, "СР")
}
}
}
override fun onFailure(call: Call<ScheduleResponse>, t: Throwable) {
}
})
}
}
}
override fun onFailure(call: Call<WeekResponse>, t: Throwable) {
}
})
adapter.notifyDataSetChanged()
viewPager.adapter = adapter
tabLayout.setupWithViewPager(viewPager)
val backButton: Button = findViewById(R.id.backButton)
backButton.setOnClickListener {
val sharedPreferences = getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
editor.putString("userGroup", null)
editor.apply()
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
}
}
}
Конкретно интересует момент с добавлением фрагментов в методе onResponse. Потому что этот код работает только в пределах этой функции и мне интересно, нормально ли это и все ли правильно?
val mondayFragment = MondayFragment(scheduleList[0])
val tuesdayFragment = TuesdayFragment(scheduleList[1])
val wednesdayFragment = WednesdayFragment(scheduleList[2])
adapter.addFragment(mondayFragment, "ПН")
adapter.addFragment(tuesdayFragment, "ВТ")
adapter.addFragment(wednesdayFragment, "СР")