android - 如何在 android 中使用边界回调分页库在 nasa apod api 中显示新数据?
问题描述
我正在使用带有分页库的 NASA APOD api 制作应用程序。我使用边界回调类进行缓存。我的问题是,当数据库中已经缓存了昨天的 apod 项目时,除非我使用 onItemAtFrontLoaded() 并向上滚动,否则新图片不会显示在 recycelrview 中。我发现的唯一方法是核对数据库并再次插入所有项目。
class ApodBoundaryCallback(
private var api: ApodApi,
private val cache: ApodDao,
private val disposable: CompositeDisposable
)
: PagedList.BoundaryCallback<ApodEntity>() {
val networkState = MutableLiveData<NetworkState>()
private val TAG = ApodBoundaryCallback::class.java.simpleName
private var formatter = SimpleDateFormat("yyyy-MM-dd", Locale.US)
override fun onZeroItemsLoaded() {
Log.d(TAG, "onZeroItemsLoaded")
if (networkState.value?.status == Status.RUNNING)
return
networkState.postValue(NetworkState.LOADING)
getApodByDate(addOrSubFromDate(formatter, -20), "")
}
override fun onItemAtEndLoaded(itemAtEnd: ApodEntity) {
Log.d(TAG, "onItemAtEndLoaded")
if (networkState.value?.status == Status.RUNNING)
return
networkState.postValue(NetworkState.LOADING)
val endDate = addOrSubFromStringDate(formatter, -1, itemAtEnd.date)
val startDate = addOrSubFromStringDate(formatter, -21, itemAtEnd.date)
getApodByDate(startDate, endDate)
}
override fun onItemAtFrontLoaded(itemAtFront: ApodEntity) {
if (networkState.value?.status == Status.RUNNING)
return
networkState.postValue(NetworkState.LOADING)
getApodByDate(addOrSubFromStringDate(formatter, +1, itemAtFront.date), "")
}
private fun getApodByDate(startDate:String, endDate:String){
disposable.add(
api
.getPictures(
startDate,
endDate,
true,
Constants.API_KEY)
.subscribeOn(Schedulers.io())
.map { it.filter {apodEntity -> apodEntity.mediaType == "image" } }
.subscribe(
{
networkState.postValue(NetworkState.LOADED)
cache.insertApodList(it)
},
{
Log.e("ApodBoundary", it.message)
networkState.postValue(NetworkState.error(it.message))
}
)
)
}
private fun addOrSubFromStringDate(formatter: SimpleDateFormat, days: Int, Date: String): String{
val cal = Calendar.getInstance()
cal.time = formatter.parse(Date);
cal.add(Calendar.DATE, days)
return formatter.format(cal.time)
}
private fun addOrSubFromDate(formatter: SimpleDateFormat, days: Int): String{
val cal = Calendar.getInstance()
cal.add(Calendar.DATE, days)
return formatter.format(cal.time)
}
}
解决方案
推荐阅读
- node.js - 在服务器端 (node.js) 存储 API (Paypal) 访问令牌的位置
- arrays - 如何遍历对象中的数组,使用每个数组值的数据库调用更新对象?
- debugging - 按钮文本 - 调试帮助 - Swift
- python - 将不同的数据保存到不同的 csv 文件中
- postgresql - 列引用不明确,但只有一个表在使用?
- angular - 如何将数据发布到数据库中最新添加的资源/记录?
- java - 如何使用参数模拟 jdbcTemplate.query (Object[]{})
- python - 不知道为什么没有为最大公约数函数定义名称
- windows - 如何在 EditBox 中切换自动换行
- javascript - VUE JS 中“reversedList”计算属性的意外副作用