Вот рабочий процесс, которому я сейчас следую:
- Пользователь переходит на экран, где данные (например, сведения о продукте, категории и т. д.) извлекаются с удаленного сервера или базы данных.
- Макет сразу раздувается, и просмотры такие как TextView и RecyclerView, отображаются пустыми или неправильно, поскольку данные еще не готовы.
- Когда данные наконец извлекаются (с использованием сопрограмм или аналогичного асинхронного метода), я обновляю пользовательский интерфейс вручную.
Класс фрагмента
Код: Выделить всё
class HomePageFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
checkCategoryCallBack()
checkDealOfTheDayCallBack()
onClick()
}
private fun checkDealOfTheDayCallBack() {
homePageViewModel.gotDealOfTheDaySuccess.observe(viewLifecycleOwner) {
if (it == true) {
getDealOfTheDay()
} else {
homePageViewModel.getDealOfTheDay()
}
}
}
private fun checkCategoryCallBack() {
homePageViewModel.gotCategorySuccess.observe(requireActivity()) {
if (it == true) {
getCategories()
} else {
homePageViewModel.getCategories()
}
}
}
private fun getCategories() {
homePageViewModel.categoriesList.observe(requireActivity()) {
categoryAdapter = CategoryAdapter(it)
}
binding.rvCatefory.adapter = categoryAdapter
}
private fun getDealOfTheDay() {
homePageViewModel.dealOfTheDayList.observe(requireActivity()) {
productAdapter = ProductAdapter(it)
}
binding.rvDealOfTheDay.adapter = productAdapter
}
}
Код: Выделить всё
class HomePageViewModel : ViewModel() {
fun getCategories() {
viewModelScope.launch(Dispatchers.IO) {
try {
_categoriesList.postValue(HomePageRepository.getCategories())
_gotCategorySuccess.postValue(true)
} catch (e: Exception) {
_gotCategorySuccess.postValue(false)
}
}
}
fun getDealOfTheDay() {
viewModelScope.launch(Dispatchers.IO) {
try {
_dealOfTheDayList.postValue(HomePageRepository.getDealOfTheDayProduct())
_gotDealOfTheDaySuccess.postValue(true)
} catch (e: Exception) {
_gotDealOfTheDaySuccess.postValue(false)
}
}
}
}
- обеспечивают динамическое обновление пользовательского интерфейса при поступлении данных.
< /li>
Улучшите взаимодействие с пользователем во время получения данных (например, заполнители, индикаторы загрузки и т. д.). - Обработка сценариев, в которых не удается получить данные (например, нет подключения к Интернету или ошибки API).
Подробнее здесь: https://stackoverflow.com/questions/792 ... ommerce-ap