MutableLiveData не будет вызывать загрузку после загрузки из Android-ROM с помощью PagedList

У меня есть 70 itens, хранящихся в моем ПЗУ, и я хотел бы получить постраничное количество 15. Я до сих пор читал много постов со связанными вопросами, но ни один из них не был полезен для меня.

Некоторые возможные причины loadAfter не срабатывает:

Решение 1: звонок getItem внутри onBindViewHolder

Решение 2: позвоните submitList в PagedListAdapter

Решение 3: заменить ListAdapter с участием PagedListAdapter

Я предполагаю DataBinding хорошо, так как все работает без попыток подкачки.

Я издеваюсь над своим источником данных, чтобы понять, что происходит. Некоторые функции приостановлены, потому что они должны иметь данные, поступающие из ПЗУ, которое требует этого. Мой код состояния будет как:

АДАПТЕР

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    getItem(position).let { wkda ->
        with(holder) {
            wkda?.apply { bind(createOnClickListener(this)) }
        }
    }
}

ФРАГМЕНТ

vm.manufacturers.observe(viewLifecycleOwner) { manufacturers ->            
            adapter.submitList(manufacturers)
}

ViewModel

var manufacturers: MutableLiveData<PagedList<WKDA>> = MutableLiveData()

init {
  viewModelScope.launch {
    repository.getManufacturers(manufacturers)
  }
}

СКЛАД

suspend fun getManufacturers(manufacturers: MutableLiveData<PagedList<WKDA>>) {
        withContext(Dispatchers.IO) {
            manufacturers.postValue(ManufacturerPagedList.
                getInstance().
                fetchPage())
        }
}

ПРОИЗВОДСТВЕННЫЙ СПИСОК

private val executor = ManufacturerExecutor()

private val paginationConfig: PagedList.Config = PagedList.Config.Builder()
        .setPageSize(PAGE_SIZE)
        .setPrefetchDistance(FETCH_DISTANCE)
        .setEnablePlaceholders(false)
        .build()

companion object {
        @Volatile
        private var instance: ManufacturerPagedList? = null
            fun getInstance() = instance ?: synchronized(this) {
                ManufacturerPagedList().also {
                    instance = it
                }
        }
    }

fun fetchPage(): PagedList<WKDA> = PagedList.Builder<Int, WKDA>(
            MockDataSource(),
            paginationConfig)
            .setInitialKey(INITIAL_KEY)
            .setFetchExecutor(executor)
            .setNotifyExecutor(executor)
            .build()
}

ИСТОЧНИК ДАННЫХ

class MockDataSource : PageKeyedDataSource<Int, WKDA>() {
    override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, WKDA>) {
        callback.onResult(List(20) { generatePost(params.requestedLoadSize) }.toList(), -1, 1)
    }

    override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, WKDA>) {
        callback.onResult(List(20) { generatePost(params.key) }.toList(), params.key + 1)
    }

    override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, WKDA>) {
        callback.onResult(List(20) { generatePost(params.key) }.toList(), params.key - 1)
    }

    private fun generatePost(key: Int): WKDA {
        return WKDA("name", "author $key")
    }
}

Константы

const val INITIAL_KEY: Int = 0
const val PAGE_SIZE: Int = 15
const val FETCH_DISTANCE: Int = 1

Что мне здесь не хватает?

1 ответ

Решение

После проверки: loadAfter был вызван правильно. Проблема была в самой модели:

wkda.id всегда имел одно и то же значение "name"

DiffCallback сравнил старый список объектов с новым и не увидел различий, поэтому элемент "дубликаты" не был добавлен в адаптер

Другие вопросы по тегам