Как очистить / удалить все элементы в адаптере списка страниц

Я использую библиотеку подкачки Android, чтобы показать элементы результатов поиска, есть ли способ очистить / удалить все загруженные элементы результатов, вызов Invalidate для живого Paged List, обновляющий список, не очистить / удалить элементы

In Activity: 
 fun clearSearchResult() {
        if (productSearchResultItemAdapter.itemCount > 0) {
            viewModel.invalidateResultList()
        }
    }


In ViewModel
 private fun searchProductByTerm(searchTerm: String): Listing<Item> {
        sourceFactory = ProductSearchItemDataSourceFactory(productSearchUC, compositeDisposable, searchTerm, resourceResolver)

        val livePagedList = LivePagedListBuilder(sourceFactory, pagedListConfig)
                //The executor used to fetch additional pages from the DataSource
                .setFetchExecutor(getNetworkExecutor())
                .build()

        return Listing(
                pagedList = livePagedList,
                networkState = switchMap(sourceFactory.sourceLiveData) {
                    it.networkState
                },
                retry = {
                    sourceFactory.sourceLiveData.value?.retryAllFailed()
                }
        )

    }


    fun invalidateResultList() {
        sourceFactory?.sourceLiveData?.value?.invalidate()
    }

private val productSearchName = MutableLiveData<String>()
    private val repoResult = map(productSearchName) {
        searchProductByTerm(it)
    }

5 ответов

If you're working with PagingDataAdapter, searchAdapter.submitData(lifecycle, PagingData.empty()) works

Отправка null очистить текущий загруженный список страниц

  productSearchResultItemAdapter.submitList(null)

В Java:

Я очистил все элементы в PagedListAdapter, вызвав invalidate() в экземпляре DataSource, подобном этому

public void clear(){
   movieDataSource.invalidate();
}

Добавьте этот метод в свою ViewModel, затем вызовите его в своей деятельности

movieViewModel.clear();
movieAdapter.notifyDataSetChanged();

Затем загрузите любые данные, которые хотите

Вы можете увидеть, как я этого добился в своем проекте.

Вот ссылка: https://github.com/Marwa-Eltayeb/MovieTrailer

Во фрагменте

      lifecycleScope.launch {
                viewModel.currentResult = null
                viewModel.getSearchAudio(binding.etxtSearch.text.toString().trim(), 0).collectLatest { it ->
                    Log.v(mTAG, "Status: New record")
                    adapterAudioList.submitData(it)
                }
            }
               

В ViewModel

      var currentResult: Flow<PagingData<AudioModel>>? = null
fun getSearchAudio(trackName: String, lastPageCount: Int): Flow<PagingData<AudioModel>> {
    val lastResult = currentResult
    if (lastResult != null) {
        return lastResult
    }
    val newResult: Flow<PagingData<AudioModel>> = videoRepository.getAudioSearchPaging(trackName, lastPageCount).cachedIn(viewModelScope)
    currentResult = newResult
    return newResult
}

В видеорепозитории

      fun getAudioSearchPaging(trackName: String, lastPageCount: Int): Flow<PagingData<AudioModel>> {
    return Pager(
        config = PagingConfig(pageSize = KeyConstants.AUDIO_PAGE_SIZE, enablePlaceholders = false),
        pagingSourceFactory = { AudioSearchPagingSource(context, trackName, lastPageCount) },
    ).flow
}

Перед аннулированием очистите ваш элемент данных списка. Как мы сделали простым способом:

list.clear();
adapter.notifyDataSetChanged();
Другие вопросы по тегам