Библиотека подкачки не запускает наблюдение при загрузке исходных данных - PullRequest
0 голосов
/ 23 сентября 2019

Я настраиваю постраничный список элементов, которые я получаю в источнике данных с сопрограммами, также я наблюдаю этот список, чтобы отправить его в адаптер, но когда он первоначально загружает некоторые данные, он не вызывает обратный вызов наблюдения.Что я могу сделать, чтобы справиться с этим?

Я пытался отладить эту вещь, и я обнаружил, что список ArrayList> mCallbacks в PagedList, не содержит никаких обратных вызовов, когда он пытался уведомить об изменениях данных, но я незнать, что с этим делать.

Источник данных из данных будет выбран и выгружен.

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
                }
            })
}

И, наконец, код в моемviewmodel

    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()
    }

Я ожидаю, что данные будут извлечены после успешного вызова API в методе loadInitial и триггера обратного вызова наблюдения.

1 Ответ

0 голосов
/ 25 сентября 2019

Наконец, после исследования я нашел ответ на свой вопрос.


Проблема была в этом коде

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 в начале.

Удачи всем!

...