#android #kotlin #android-fragments #navigation
Вопрос:
У меня есть фрагмент, содержащий обзор вторичной переработки. В этом фрагменте я делаю вызов, чтобы получить данные из API, а затем отобразить данные в recyclerview. Я вызываю метод, чтобы получить данные в методе onViewCreated. Когда я нажимаю на элемент из списка, открывается фрагмент карты и отображается местоположение этого элемента. Теперь, когда я нажимаю кнопку «Назад», я не хочу, чтобы метод получения данных вызывался снова. Есть какие-нибудь предложения о том, как я могу это сделать? Может быть, это простое решение, но я не могу его понять. Спасибо
Фрагмент списка:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val backBtn: AppCompatImageView = requireActivity().findViewById(R.id.back_btn)
backBtn.visibility = View.GONE
binding.swipeRefreshMeteors.setOnRefreshListener {
binding.swipeRefreshMeteors.isRefreshing = false
getMeteorsDetails()
}
getMeteorsDetails()
observeIsLoading()
observeMeteorsData()
}
private fun getMeteorsDetails(){
meteorsViewmodel.getMeteorsData()
}
Фрагмент карты
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val backBtn: AppCompatImageView = requireActivity().findViewById(R.id.back_btn)
backBtn.visibility = View.VISIBLE
backBtn.setOnClickListener {
findNavController().navigateUp()
}
val meteorName = arguments?.getString("meteor_name")
val meteorLat = arguments?.getString("meteor_lat")
val meteorLong = arguments?.getString("meteor_long")
val meteorFallenYear = arguments?.getString("meteor_fallen_year")
supportMapFragment = childFragmentManager.findFragmentById(R.id.google_map) as SupportMapFragment
supportMapFragment.getMapAsync { googleMap ->
val meteorLocation = LatLng(meteorLat!!.toDouble(), meteorLong!!.toDouble())
googleMap.addMarker(MarkerOptions().position(meteorLocation).title(meteorName).snippet(
"Year: $meteorFallenYear"
).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)))!!.showInfoWindow()
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(meteorLocation, 10f))
//googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(meteorLocation, 10f))
}
}
Модель представления
val getMeteorsResponse: LiveData<Resource<ArrayList<MeteorModel>>?>
get() = _getMeteorsResponse
private val _getMeteorsResponse = MutableLiveData<Resource<ArrayList<MeteorModel>>?>()
val isLoading: LiveData<Boolean>
get() = _isLoading
private val _isLoading = MutableLiveData(false)
fun getMeteorsData(){
_isLoading.value = true
disposable.add(
meteorsRepository.getMeteors()
.subscribeOn(Schedulers.newThread())
.observeOn(io.reactivex.android.schedulers.AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableSingleObserver<ArrayList<MeteorModel>>(){
override fun onSuccess(response : ArrayList<MeteorModel>) {
_isLoading.value = false
_getMeteorsResponse.value = Resource.success(response)
}
override fun onError(e: Throwable) {
_isLoading.value = false
_getMeteorsResponse.value = Resource.error(e.message ?: "Error", null)
Log.e(TAG, e.message.toString())
}
})
)
}
fun resetMeteors(){
_getMeteorsResponse.value = null
}
Комментарии:
1. Используйте a
ViewModel
и выполните вызов API внутриinit
ViewModel
.2. Я использую Viewmodel, я обновляю вопрос с помощью кода viewmodel, не могли бы вы, пожалуйста, взглянуть и привести мне пример? Спасибо
3. @OhhhThatVarun Я обновил вопрос
4. Мне нет смысла тебе это объяснять. Читать это
Ответ №1:
Используйте onBackPressed()
в фрагменте карты для нажатия кнопки «Назад».
Попробуйте catchIn()
использовать функцию для ваших данных ответа в модели представления.