如何使用android中的boundarycallback分页库在nasa apod api中显示新数据?
我正在用NASA APOD api和分页库制作一个应用程序。我使用boundarycallback类进行缓存。我的问题是,当数据库中已经缓存了昨天的apod项目时,新图片将不会显示在RecycelView中,除非我使用FrontLoaded()并向上滚动。我找到的唯一方法是重新检查数据库并插入所有项目如何使用android中的boundarycallback分页库在nasa apod api中显示新数据?,android,pagination,android-jetpack,android-paging,Android,Pagination,Android Jetpack,Android Paging,我正在用NASA APOD api和分页库制作一个应用程序。我使用boundarycallback类进行缓存。我的问题是,当数据库中已经缓存了昨天的apod项目时,新图片将不会显示在RecycelView中,除非我使用FrontLoaded()并向上滚动。我找到的唯一方法是重新检查数据库并插入所有项目 class ApodBoundaryCallback( private var api: ApodApi, private val cache: ApodDao, priv
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)
}
}
类ApodBoundaryCallback(
私有var api:ApodApi,
私有val缓存:ApodDao,
私人val一次性:可组合
)
:PagedList.BoundaryCallback(){
val networkState=MutableLiveData()
private val TAG=ApodBoundaryCallback::class.java.simpleName
私有变量格式化程序=SimpleDataFormat(“yyyy-MM-dd”,Locale.US)
覆盖ZeroItemsLoaded()上的乐趣{
Log.d(标记“onZeroItemsLoaded”)
if(networkState.value?.status==status.RUNNING)
返回
networkState.postValue(networkState.LOADING)
getApodByDate(addOrSubFromDate(格式化程序,-20),“”)
}
覆盖已加载(ItemEnd:ApodEntity){
日志d(标记“未加载”)
if(networkState.value?.status==status.RUNNING)
返回
networkState.postValue(networkState.LOADING)
val endDate=addOrSubFromStringDate(格式化程序,-1,itemAtEnd.date)
val startDate=addOrSubFromStringDate(格式化程序,-21,itemAtEnd.date)
getApodByDate(开始日期,结束日期)
}
覆盖前面加载的项目(itemAtFront:ApodEntity){
if(networkState.value?.status==status.RUNNING)
返回
networkState.postValue(networkState.LOADING)
getApodByDate(addOrSubFromStringDate(格式化程序+1,itemAtFront.date),“”)
}
私人娱乐getApodByDate(开始日期:字符串,结束日期:字符串){
一次性。添加(
应用程序编程接口
.getPictures(
开始日期,
结束日期,
是的,
常数(API_键)
.subscribeOn(Schedulers.io())
.map{it.filter{apodEntity->apodEntity.mediaType==“image”}
.订阅(
{
networkState.postValue(networkState.LOADED)
cache.insertApodList(it)
},
{
Log.e(“ApodBoundary”,it.message)
networkState.postValue(networkState.error(it.message))
}
)
)
}
private fun addOrSubFromStringDate(格式化程序:SimpleDateFormat,天:Int,日期:String):String{
val cal=Calendar.getInstance()
cal.time=格式化程序.parse(日期);
计算添加(日历日期,天)
返回格式化程序.format(校准时间)
}
private fun addor subfromDate(格式化程序:SimpleDateFormat,天数:Int):字符串{
val cal=Calendar.getInstance()
计算添加(日历日期,天)
返回格式化程序.format(校准时间)
}
}
请您提供有关实施的更多信息,好吗?您的BoundaryCallback是如何实现的?您是否使用Room或其他方法进行缓存?您是否正在使用自定义数据源(以及它是如何实现的)?boundaryCallback中的更多代码将有助于找到解决方案。请发布您迄今为止尝试的内容-共享您当前的代码/解决方案。我正在使用room。我觉得问题出在图书馆。我读了谷歌的例子。你能提供更多关于你的实现的信息吗?您的BoundaryCallback是如何实现的?您是否使用Room或其他方法进行缓存?您是否正在使用自定义数据源(以及它是如何实现的)?boundaryCallback中的更多代码将有助于找到解决方案。请发布您迄今为止尝试的内容-共享您当前的代码/解决方案。我正在使用room。我觉得问题出在图书馆。我读了谷歌的样本。