我的Android应用允许用户从网络中获取特定日期的照片列表。它使用Retrofit和Glide来做到这一点。 Glide缓存所有图像。所获取的列表可以是0到1000张相机(使用0到10张相机拍摄的照片)。
结果将存储在LiveData值中,如下所示:
val photosFromApi: LiveData<List<Photo>> = photoRepository.getPhotos()
UI控件(片段)在我的ViewModel中调用此函数:
fun refreshPhotos(date: String, camera: String) {
viewModelScope.launch {
photoRepository.getPhotos(date, camera) // Coroutine suspend function
}
然后,用户可以通过菜单调用以下功能来过滤结果:
fun setCameraFilter(cameraFilter: String?) {
try {
refreshPhotos(photosFromApi.value?.get(0)?.date, cameraFilter)
} catch (e: Exception) {
Log.e("Camera filter error", e.toString())
}
只要返回的列表不为空,此方法就可以正常工作。如果用户选择返回空列表的camerafilter,则值photosFromNasaApi.value?.get(0)?. date变为空。这意味着我的过滤器功能在用户下次调用该功能时不再起作用。然后,我得到一个“索引超出范围例外”。这是有道理的,因为LiveData val'photosFromApi'现在为空。
我需要编写哪种逻辑来防止这种情况?我想使用LiveData中以前存储的值(我需要重新查询的日期)。我无法编写条件来检查列表是否为空,因为只有在用户选择了camerafilter后才能验证此列表。
我查看了“ Transformations.switchMap”,但是由于我不更改类型,因此不确定是否正是我所需要的。