我使用改造来获取数据以在 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)
}
})