Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使自定义PageKeyedDataSource无效会使回收器视图跳转_Android_Pagination_Android Paging_Android Paging Library - Fatal编程技术网

Android 使自定义PageKeyedDataSource无效会使回收器视图跳转

Android 使自定义PageKeyedDataSource无效会使回收器视图跳转,android,pagination,android-paging,android-paging-library,Android,Pagination,Android Paging,Android Paging Library,我正在尝试实现一个带有定制PageKeyedDataSource的android分页库,该数据源将查询数据库中的数据,并在该页面上随机插入广告 我实现了分页,但是每当我滚动到第二页并使数据源无效时,recycler视图就会跳回到第二页的末尾 这是什么原因 数据源: class ColorsDataSource( private val colorsRepository: ColorsRepository ) : PageKeyedDataSource<Int, ColorE

我正在尝试实现一个带有定制PageKeyedDataSource的android分页库,该数据源将查询数据库中的数据,并在该页面上随机插入广告

我实现了分页,但是每当我滚动到第二页并使数据源无效时,recycler视图就会跳回到第二页的末尾

这是什么原因

数据源:

    class ColorsDataSource(
    private val colorsRepository: ColorsRepository
) : PageKeyedDataSource<Int, ColorEntity>() {

    override fun loadInitial(
        params: LoadInitialParams<Int>,
        callback: LoadInitialCallback<Int, ColorEntity>
    ) {
        Timber.i("loadInitial()  offset 0 params.requestedLoadSize $params.requestedLoadSize")
        val resultFromDB = colorsRepository.getColors(0, params.requestedLoadSize)
        // TODO insert Ads here
        callback.onResult(resultFromDB, null, 1)
    }

    override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, ColorEntity>) {
        val offset = params.key * params.requestedLoadSize
        Timber.i("loadAfter()    offset $offset params.requestedLoadSize $params.requestedLoadSize")
        val resultFromDB = colorsRepository.getColors(
            offset,
            params.requestedLoadSize
        )
        // TODO insert Ads here
        callback.onResult(resultFromDB, params.key + 1)
    }

    override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, ColorEntity>) {
        // No- Op
    }
}
class ColorsDataSource(
private val colorsRepository:colorsRepository
):PageKeyedDataSource(){
覆盖趣味加载初始值(
params:LoadInitialParams,
回调:LoadInitialCallback
) {
Timber.i(“loadInitial()偏移量0 params.requestedLoadSize$params.requestedLoadSize”)
val resultFromDB=ColorsProposition.getColors(0,params.requestedLoadSize)
//TODO在此处插入广告
onResult(resultFromDB,null,1)
}
重写fun loadAfter(参数:LoadParams,回调:LoadCallback){
val offset=params.key*params.requestedLoadSize
Timber.i(“loadAfter()偏移$offset params.requestedLoadSize$params.requestedLoadSize”)
val resultFromDB=colorsepository.getColors(
抵消,
params.requestedLoadSize
)
//TODO在此处插入广告
onResult(resultFromDB,params.key+1)
}
覆盖有趣的loadBefore(参数:LoadParams,回调:LoadCallback){
//无操作
}
}
边界回调

class ColorsBoundaryCallback(
    private val colorsRepository: ColorsRepository,
    ioExecutor: Executor,
    private val invalidate: () -> Unit
) : PagedList.BoundaryCallback<ColorEntity>() {

    private val helper = PagingRequestHelper(ioExecutor)

    /**
     * Database returned 0 items. We should query the backend for more items.
     */
    @MainThread
    override fun onZeroItemsLoaded() {
        helper.runIfNotRunning(PagingRequestHelper.RequestType.INITIAL) { pagingRequestHelperCallback ->
            Timber.i("onZeroItemsLoaded() ")
            colorsRepository.colorsApiService.getColorsByCall(
                ColorsRepository.getQueryParams(
                    1,
                    ColorViewModel.PAGE_SIZE
                )
            ).enqueue(object : Callback<List<ColorsModel?>?> {
                override fun onFailure(call: Call<List<ColorsModel?>?>, t: Throwable) {
                    handleFailure(t, pagingRequestHelperCallback)
                }

                override fun onResponse(
                    call: Call<List<ColorsModel?>?>,
                    response: Response<List<ColorsModel?>?>
                ) {
                    handleSuccess(response, pagingRequestHelperCallback)
                }
            })
        }
    }

    private fun handleSuccess(
        response: Response<List<ColorsModel?>?>,
        pagingRequestHelperCallback: PagingRequestHelper.Request.Callback
    ) {
        colorsRepository.saveColorsIntoDb(response.body())
        invalidate.invoke()
        Timber.i("onZeroItemsLoaded() with listOfColors")
        pagingRequestHelperCallback.recordSuccess()
    }

    /**
     * User reached to the end of the list.
     */
    @MainThread
    override fun onItemAtEndLoaded(itemAtEnd: ColorEntity) {
        Timber.i("onItemAtEndLoaded() ")
        helper.runIfNotRunning(PagingRequestHelper.RequestType.AFTER) { pagingRequestHelperCallback ->
            val nextPage = itemAtEnd.nextPage?.toInt() ?: 0
            colorsRepository.colorsApiService.getColorsByCall(
                ColorsRepository.getQueryParams(
                    nextPage,
                    ColorViewModel.PAGE_SIZE
                )
            ).enqueue(object : Callback<List<ColorsModel?>?> {
                override fun onFailure(call: Call<List<ColorsModel?>?>, t: Throwable) {
                    handleFailure(t, pagingRequestHelperCallback)
                }

                override fun onResponse(
                    call: Call<List<ColorsModel?>?>,
                    response: Response<List<ColorsModel?>?>
                ) {
                    handleSuccess(response, pagingRequestHelperCallback)
                }

            })
        }
    }

    private fun handleFailure(
        t: Throwable,
        pagingRequestHelperCallback: PagingRequestHelper.Request.Callback
    ) {
        Timber.e(t)
        pagingRequestHelperCallback.recordFailure(t)
    }
}
类ColorsBoundaryCallback(
private val colorsRepository:colorsRepository,
执行人:执行人,
私有val无效:()->单位
):PagedList.BoundaryCallback(){
private val helper=PagingRequestHelper(ioExecutor)
/**
*数据库返回0个项目。我们应该在后端查询更多项目。
*/
@主线
覆盖ZeroItemsLoaded()上的乐趣{
helper.RunnifNotRunning(PagingRequestHelper.RequestType.INITIAL){pagingRequestHelperCallback->
Timber.i(“onZeroItemsLoaded()”)
colorseposition.colorsApiService.getColorsByCall(
ColorsRepository.getQueryParams(
1.
ColorViewModel.PAGE\u大小
)
).enqueue(对象:回调{
覆盖失效时的乐趣(调用:调用,t:可丢弃){
handleFailure(t,pagingRequestHelperCallback)
}
覆盖响应(
呼叫:呼叫,,
答复:答复
) {
handleSuccess(响应、pagingRequestHelperCallback)
}
})
}
}
私人娱乐手感成功(
答复:答复,,
pagingRequestHelperCallback:PagingRequestHelper.Request.Callback
) {
colorsepository.saveColorsIntoDb(response.body())
invoke()无效
Timber.i(“onZeroItemsLoaded()和颜色列表”)
pagingRequestHelperCallback.recordSuccess()分页
}
/**
*用户已到达列表的末尾。
*/
@主线
覆盖已加载(ItemEnd:ColorEntity){
Timber.i(“未加载()”)
helper.RunnifNotRunning(PagingRequestHelper.RequestType.AFTER){pagingRequestHelperCallback->
val nextPage=itemAtEnd.nextPage?.toInt():0
colorsepository.colorsApiService.getColorsByCall(
ColorsRepository.getQueryParams(
下一页,
ColorViewModel.PAGE\u大小
)
).enqueue(对象:回调{
覆盖失效时的乐趣(调用:调用,t:可丢弃){
handleFailure(t,pagingRequestHelperCallback)
}
覆盖响应(
呼叫:呼叫,,
答复:答复
) {
handleSuccess(响应、pagingRequestHelperCallback)
}
})
}
}
私人娱乐手袋(
t:一次性的,
pagingRequestHelperCallback:PagingRequestHelper.Request.Callback
) {
木材.e(t)
pagingRequestHelperCallback.recordFailure(t)
}
}
适配器的DiffUtil

class DiffUtilCallBack : DiffUtil.ItemCallback<ColorEntity>() {
        override fun areItemsTheSame(oldItem: ColorEntity, newItem: ColorEntity): Boolean {
            return oldItem == newItem
        }

        override fun areContentsTheSame(oldItem: ColorEntity, newItem: ColorEntity): Boolean {
            return oldItem.hexString == newItem.hexString
                    && oldItem.name == newItem.name
                    && oldItem.colorId == newItem.colorId
        }
    }
class DiffUtilCallBack:DiffUtil.ItemCallback(){
覆盖乐趣项相同(旧项:ColorEntity,新项:ColorEntity):布尔值{
返回oldItem==newItem
}
覆盖内容相同(旧项:ColorEntity,新项:ColorEntity):布尔值{
返回oldItem.hextString==newItem.hextString
&&oldItem.name==newItem.name
&&oldItem.colorId==newItem.colorId
}
}
视图模型

class ColorViewModel(private val repository: ColorsRepository) : ViewModel() {

    fun getColors(): LiveData<PagedList<ColorEntity>> = postsLiveData

    private var postsLiveData: LiveData<PagedList<ColorEntity>>
    lateinit var dataSourceFactory: DataSource.Factory<Int, ColorEntity>
    lateinit var dataSource: ColorsDataSource

    init {
        val config = PagedList.Config.Builder()
            .setPageSize(PAGE_SIZE)
            .setEnablePlaceholders(false)
            .build()

        val builder = initializedPagedListBuilder(config)
        val contentBoundaryCallBack =
            ColorsBoundaryCallback(repository, Executors.newSingleThreadExecutor()) {
                invalidate()
            }
        builder.setBoundaryCallback(contentBoundaryCallBack)
        postsLiveData = builder.build()
    }

    private fun initializedPagedListBuilder(config: PagedList.Config):
            LivePagedListBuilder<Int, ColorEntity> {

        dataSourceFactory = object : DataSource.Factory<Int, ColorEntity>() {
            override fun create(): DataSource<Int, ColorEntity> {
                dataSource =  ColorsDataSource(repository)
                return dataSource
            }
        }
        return LivePagedListBuilder<Int, ColorEntity>(dataSourceFactory, config)
    }

    private fun invalidate() {
        dataSource.invalidate()
    }

    companion object {
        const val PAGE_SIZE = 8
    }
}
class ColorViewModel(专用val存储库:ColorsRepository):ViewModel(){
fun getColors():LiveData=postsLiveData
私有变量postsLiveData:LiveData
lateinit var dataSourceFactory:DataSource.Factory
lateinit变量数据源:ColorsDataSource
初始化{
val config=PagedList.config.Builder()
.setPageSize(页面大小)
.setEnablePlaceholders(false)
.build()
val builder=初始化的PagedListBuilder(配置)
val contentBoundaryCallBack=
ColorsBoundaryCallback(存储库,Executors.newSingleThreadExecutor()){
使无效
}
builder.setBoundaryCallback(contentBoundaryCallBack)
postsLiveData=builder.build()
}
private fun initializedPagedListBuilder(配置:PagedList.config):
LivePagedListBuilder{
dataSourceFactory=对象:DataSource.Factory(){
重写fun create():数据源{
dataSource=ColorsDataSource(存储库)
返回数据源
}
}
返回LivePagedListBuilder(dataSourceFactory,配置)
}
私人娱乐场
class PageTracker {
    var currentPage = 0
}
class ColorsDataSource(
    private val pageTracker: PageTracker
    private val colorsRepository: ColorsRepository
) : PageKeyedDataSource<Int, ColorEntity>() {

    override fun loadInitial(
        params: LoadInitialParams<Int>,
        callback: LoadInitialCallback<Int, ColorEntity> 
    ) {
        //...
        val alreadyLoadedItems = (pageTracker.currentPage + 1) * params.requestedLoadSize
        val resultFromDB = colorsRepository.getColors(0, alreadyLoadedItems)
        callback.onResult(resultFromDB, null, pageTracker.currentPage + 1)
    }

    override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, ColorEntity>) {
        pageTracker.currentPage = params.key
        //...
    }

    //...
}
dataSourceFactory = object : DataSource.Factory<Int, ColorEntity>() {

    val pageTracker = PageTracker()

    override fun create(): DataSource<Int, ColorEntity> {
        dataSource =  ColorsDataSource(pageTracker, repository)
        return dataSource
    }
}
override fun areItemsTheSame(oldItem: ColorEntity, newItem: ColorEntity): Boolean 
              = oldItem.db_id == newItem.db_id