首页 > 解决方案 > 如何在 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)
    }


}

标签: androidpaginationandroid-jetpackandroid-paging

解决方案


推荐阅读