【问题标题】:Paging Library doesn't trigger observe when load initial data加载初始数据时分页库不会触发观察
【发布时间】:2019-09-23 09:33:02
【问题描述】:

我正在使用协程设置我在数据源中获取的项目的分页列表,我也在观察这个列表以在适配器中提交它,但是当它最初加载一些数据时,它不会触发观察回调。我该怎么办?

我尝试调试这个东西,发现PagedList中的ArrayList> mCallbacks列表,在尝试通知数据更改时不包含任何回调,但我不知道如何处理。

从数据中获取数据源并进行分页。

class PagedDataSource(private val account: Account, private val getItems: GetItems): PageKeyedDataSource<Int, Item>() {

    override fun loadInitial(
        params: LoadInitialParams<Int>,
        callback: LoadInitialCallback<Int, Transaction>
    ) {
        GlobalScope.launch {
            val startPage = 0
            account.id?.let {
                val items = getItems(it, startPage).body.toMutableList()
                callback.onResult(items, null, 1)
            }
        }
    }

    override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, Item>) {
        GlobalScope.launch {
            account.id?.let {
                val list = getItems(it, params.key)
                val items = list.body.toMutableList()
                callback.onResult(items, if (params.key >= list.totalPages) null else params.key + 1)
            }
        }
    }

    override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, Item>) {
        //NO NEED
    }

}

片段中的代码:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState) 
        pagedAdapter = PagedAdapter()

        vItems.layoutManager = LinearLayoutManager(context)
        vItems.isNestedScrollingEnabled = false
        vItems.adapter = pagedAdapter

                   items.observe(viewLifecycleOwner, Observer { items ->
                if (items != null && items.isNotEmpty()) {
                   pagedAdapter.submitList(items)
                } else {
                    vItemsTitle.visibility = View.VISIBLE
                }
            })
}

最后在我的视图模型中编码

    init {
        items = initializedPagedList()
    }

    private fun initializedPagedList() : LiveData<PagedList<Item>> {
        val factory = object: DataSource.Factory<Int, Item>() {
            override fun create(): DataSource<Int, Item> {
                return PagedDataSource(account, getItems)
            }
        }
        val config = PagedList.Config.Builder()
            .setPageSize(20)
            .setEnablePlaceholders(false)
            .build()

        return LivePagedListBuilder(factory, config).build()
    }

我希望在loadInitial方法中成功调用api并触发观察回调后会获取数据。

【问题讨论】:

    标签: android kotlin android-paging


    【解决方案1】:

    终于在研究之后,我找到了我的问题的答案。


    问题出在这段代码中

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState) 
        pagedAdapter = PagedAdapter()
    
        vItems.layoutManager = LinearLayoutManager(context)
        vItems.isNestedScrollingEnabled = false
        vItems.adapter = pagedAdapter
    
                   items.observe(viewLifecycleOwner, Observer { items ->
                if (items != null && items.isNotEmpty()) {
                   pagedAdapter.submitList(items)
                } else {
                    vItemsTitle.visibility = View.VISIBLE
                }
            })
     }
    

    我需要把它改成

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState) 
        pagedAdapter = PagedAdapter()
    
        vItems.layoutManager = LinearLayoutManager(context)
        vItems.isNestedScrollingEnabled = false
        vItems.adapter = pagedAdapter
    
                   items.observe(viewLifecycleOwner, Observer { items ->
                   pagedAdapter.submitList(items)
            })
     }
    

    我认为这是因为在前台 PagedList 异步工作/您需要提交此列表一次,然后数据源将直接向适配器发送更新,避免观察。在我的情况下,如果列表不为空,我将提交,但是当您在开始时创建 PagedList 时它将始终为空。

    祝大家好运!

    【讨论】:

    • 我相信这是因为 LiveData 项目实际上并没有发出新的 PagedList,而是 PagedList 的内容正在发生变化。因此必须提交初始分页列表,并且适配器将在其内容更改时进行处理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2018-01-03
    • 1970-01-01
    • 2021-09-05
    • 2018-03-11
    • 2013-12-10
    • 1970-01-01
    相关资源
    最近更新 更多