RecyclerView 在 retrofit 之前显示获取所有数据

问题描述 投票:0回答:0

我使用改造来获取数据以在 recyclerView 中显示。但是有很多数据,recyclerView 显示得比所有数据都早。所以,在屏幕上我得到空列表。我的代码:

class CatsViewModel constructor(private val catsRepository: CatsRepository) : ViewModel() {
private var job: Job? = null
private val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
    onError("Exception handled: ${throwable.localizedMessage}")
}
val citiesList = MutableLiveData<String>()

fun refresh() {
    fetchUsers()
}
private fun fetchUsers() {
    loading.value = true
    job = CoroutineScope(Dispatchers.IO + exceptionHandler).launch {
        val response = catsRepository.getAllCities()
        withContext(Dispatchers.Main) {
            if (response.isSuccessful) {
             citiesList.value = response.body()?.data?.get(0)

            } else {
                onError("Error : ${response.message()} ")
            }
        }
    }

}

override fun onCleared() {
    super.onCleared()
    job?.cancel()
}

class CatsRepository constructor (private val retrofitService: APIService) {

suspend fun getAllCities() = retrofitService.getCitiesList(RequestModel("germany"))

}

CatsActivity 类:AppCompatActivity()、CustomCityAdapter.OnItemClickListener {

private lateinit var viewModel: CatsViewModel
private lateinit var cityAdapter: CustomCityAdapter
lateinit var binding: CatsActivityBinding
private val citiesList = arrayListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = CatsActivityBinding.inflate(layoutInflater)
    setContentView(R.layout.cats_activity)

    val retrofitService = APIService.getInstance()
    val mainRepository = CatsRepository(retrofitService)

    cityAdapter = CustomCityAdapter(this)
    binding.usersList.layoutManager =
        LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false)
    binding.usersList.setItemAnimator(DefaultItemAnimator())
    binding.usersList.adapter = cityAdapter


    viewModel = ViewModelProvider(
        this,
        CatsViewModelFactory(mainRepository)
    ).get(CatsViewModel::class.java)

    viewModel.refresh()
    observeViewModel()
}
private fun observeViewModel() {
    viewModel.citiesList.observe(this, Observer {countries ->
        countries?.let {
            binding.usersList.visibility = View.VISIBLE
       citiesList.add(it)
                cityAdapter.setCities(citiesList)
            }
    })
android kotlin retrofit kotlin-coroutines
© www.soinside.com 2019 - 2024. All rights reserved.