I'm making an app with NASA APOD api with paging library. I use boundarycallback class for caching. My problem is that when there is already cached apod items in the database from yesterday, the new pictures won't show in the recycelrview unless I use onItemAtFrontLoaded() and scroll up. The only way I found was to nuke the database and insert all items again.
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)
}
}