如何使用android中的boundarycallback分页库在nasa apod api中显示新数据?

如何使用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

我正在用NASA APOD api和分页库制作一个应用程序。我使用boundarycallback类进行缓存。我的问题是,当数据库中已经缓存了昨天的apod项目时,新图片将不会显示在RecycelView中,除非我使用FrontLoaded()并向上滚动。我找到的唯一方法是重新检查数据库并插入所有项目

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。我觉得问题出在图书馆。我读了谷歌的样本。