Невозможно обновить sh recyclerView с разбивкой на страницы - PullRequest
1 голос
/ 10 июля 2020

У меня есть RecyclerView, который заполняется данными с разбивкой на страницы.

Мне нужно обновить sh его через SwipeRefreshLayout, но пока я не могу этого сделать.

Я перепробовал множество ссылок, похожих на это, но безуспешно. Кроме того, чтобы вы, ребята, знали: когда я делаю refre sh, данные извлекаются правильно, но не отображаются в recyclerView ...

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

ViewModel:

class ActivityViewModel : ViewModel() {
    var itemDataSourceFactory = OperationsDataSourceFactory()
        private set
    val livePagedList: LiveData<PagedList<Result<Operation?>>>

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

        livePagedList = LivePagedListBuilder(itemDataSourceFactory, config).build()
    }

    fun refresh() {
        itemDataSourceFactory.dataSourceLiveData.value?.endCursor = null
        itemDataSourceFactory.refresh()
    }
}

DataSourceFactory:

class OperationsDataSourceFactory :
    DataSource.Factory<String, Result<Operation?>>() {
    val dataSourceLiveData = MutableLiveData<OperationsDataSource>()
    lateinit var dataSource: OperationsDataSource
    override fun create(): DataSource<String, Result<Operation?>> {
        dataSource = OperationsDataSource()
        dataSourceLiveData.postValue(dataSource)
        return dataSource
    }

    fun refresh(){
        dataSourceLiveData.value?.invalidate()
    }
}

И во фрагменте я есть примерно так:

private fun initView() {
    binding.swipeToRefresh.setOnRefreshListener {
        itemViewModel.refresh()
    }
    getData() //observables with adapter.submitList(list)
}

1 Ответ

0 голосов
/ 20 июля 2020

Хорошо, после действительно долгих исследований, возможно, это не лучшее решение, но разработчики тоже используют его. Нам нужно "сделать недействительными" layoutManager и адаптер.

swipeToRefresh.setOnRefreshListener {
    operationsRecycler.apply {    
    layoutManager = null
    adapter = null
    layoutManager = LinearLayoutManager(
                        requireContext(),
                            LinearLayoutManager.VERTICAL,
                            false
                        )
    adapter = myAdapter
}
...