Как отобразить новые данные в nasa apod api с библиотекой пейджинга bordercallback в android? - PullRequest
1 голос
/ 28 марта 2020

Я делаю приложение с помощью API-интерфейса NASA APOD с библиотекой подкачки. Я использую класс bordercallback для кэширования. Моя проблема заключается в том, что, если со вчерашнего дня в базе данных уже есть кэшированные элементы apod, новые изображения не будут отображаться в recycelrview, если я не использую onItemAtFrontLoaded () и прокручиваю вверх. Единственный способ, который я нашел, - это сбросить базу данных и снова вставить все элементы.

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)
    }


}
...