Я делаю приложение с помощью 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)
}
}