如何解决即使不在列表底部,也会无限调用OnItemAtEndLoaded
在我的Android分页库2.0的实现中,即使未滚动到列表底部,也会多次调用OnItemAtEndLoaded()。通话继续进行,没有停止。
从API调用接收到的剧集按发布日期排序,就像EpisodeDao的getAllEpisodes()方法一样。
任何帮助将不胜感激。
class DetailsViewModel(
private val episodeBoundaryCallback: EpisodeBoundaryCallback,private val episodeDao: EpisodeDao,private val pagedListConfig: PagedList.Config
) : ViewModel() {
var episodes: LiveData<PagedList<Episode>>? = null
fun getEpisodes(podcastId: String) {
if (episodes != null
&& episodes!!.value != null
&& !episodes!!.value!!.isEmpty()
) {
return
}
episodeBoundaryCallback.param = podcastId
val dataSourceFactory = episodeDao.getAllEpisodes(podcastId)
val pagedListBuilder =
LivePagedListBuilder<Int,Episode>(dataSourceFactory,pagedListConfig)
pagedListBuilder.setInitialLoadKey(1)
pagedListBuilder.setBoundaryCallback(episodeBoundaryCallback)
episodes = pagedListBuilder.build()
}
}
class EpisodeBoundaryCallback(
private val podcastsApi: PodcastsApi,private val skipToItDatabase: SkipToItDatabase
): PagedList.BoundaryCallback<Episode>() {
private val tag = this::class.simpleName
private val loadTypeRefresh = 0
private val loadTypeAppend = 1
lateinit var param: String
var startPage: Long? = null
val loading: MutableLiveData<Boolean> = MutableLiveData()
val loadError: MutableLiveData<Boolean> = MutableLiveData()
override fun onZeroItemsLoaded() {
Log.d("REFRESHING","REFRESHING")
AppExecutors.getInstance().diskIO().execute {
requestPage(loadTypeRefresh,startPage)
}
}
override fun onItemAtEndLoaded(itemAtEnd: Episode) {
Log.d(tag,"APPEND")
AppExecutors.getInstance().diskIO().execute {
requestPage(loadTypeAppend,itemAtEnd.publishDate)
}
}
override fun onItemAtFrontLoaded(itemAtFront: Episode) {
}
private fun requestPage(requestType: Int,loadKey: Long?) {
val episodeResultCall = podcastsApi.getEpisodes(param,loadKey)
val response = episodeResultCall.execute()
if (response.isSuccessful) {
Log.d(tag,"isSuccessful")
loading.postValue(false)
loadError.postValue(false)
val body: PodcastDetails = response.body()!!
onEpisodeFetchCallback(body,requestType)
} else {
Log.d(tag,"!isSuccessful")
loading.postValue(false)
loadError.postValue(true)
}
}
var lastEpisode: Episode? = null
private fun onEpisodeFetchCallback(
podcastDetails: PodcastDetails,loadType: Int
) {
skipToItDatabase.beginTransaction()
try {
if (loadType == loadTypeRefresh) {
skipToItDatabase.episodeDao().deleteAllEpisodes()
}
val episodes = podcastDetails.episodes
for (i in episodes) {
i.podcastId = param
lastEpisode = i
}
skipToItDatabase.episodeDao().insertEpisodes(episodes)
skipToItDatabase.setTransactionSuccessful()
} finally {
skipToItDatabase.endTransaction()
}
}
}
@Dao
interface EpisodeDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertEpisodes(episodes: List<Episode>)
@Query("SELECT * FROM episodes WHERE podcast_id = :podcastId ORDER BY publish_date DESC")
fun getAllEpisodes(podcastId: String): DataSource.Factory<Int,Episode>
@Query("DELETE FROM episodes")
fun deleteAllEpisodes()
}
@Headers("X-ListenAPI-Key: ${BuildConfig.apiKey}")
@GET("podcasts/{podcast_id}?sort=recent_first")
fun getEpisodes(
@Path("podcast_id") podcastId: String,@Query("next_episode_pub_date") nextEpisodePubDate: Long?
): Call<PodcastDetails>
return new PagedList.Config.Builder()
.setPageSize(10)
.setPrefetchDistance(5)
.setEnablePlaceholders(true)
.setInitialLoadSizeHint(30)
.setMaxSize(60)
.build();
解决方法
显然这是我的XML回收者视图大小的问题
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。