0

所以我有一个 RecyclerView 并获取所有数据,然后如果用户单击某些按钮,它会触发相同的功能但使用不同的过滤器。

我遇到的问题是当新查询返回空时它不会清除旧数据。因此,如果它加载所有数据并且他们单击没有数据的过滤器,它将不会清除屏幕上的数据。

我对其进行了测试,当我选择一个包含数据的过滤器时,它将清除旧数据并显示新数据。

我在房间里试过这个,它开箱即用,但我不知道如何用 Firestore 做这个。

关于如何解决这个问题的任何想法?

这是我的仓库,它检查它是否必须从 Firestore 或 Room 获取数据。

override suspend fun getEventPagingDataFlow(filter: String): Flow<PagingData<Event>> = withContext(Dispatchers.IO){
    Pager(
        PagingConfig(
            pageSize = 30,
            enablePlaceholders = true,
            maxSize = 200)
    ) {
        if(currentBusinessType() == "ONLINE"){
            val query = firestoreQueries.getEventsCollectionQuery()

            if (filter == "ALL") FirestoreEventsPagingSource(query)
            else FirestoreEventsPagingSource(query.whereEqualTo("status", filter))

        }
        else{
            if (filter == "ALL") eventsDao.getAllPaged()
            else eventsDao.getPagedEventsWithFilter(filter)
        }
    }.flow
}

这是 Firestore 分页源

class FirestoreEventsPagingSource(
private val query: Query
) : PagingSource<QuerySnapshot, Event>() {

override suspend fun load(params: LoadParams<QuerySnapshot>): LoadResult<QuerySnapshot, Event> {
    return try {
        val currentPage = params.key ?: query
            .get()
            .await()

        val lastDocumentSnapshot = currentPage.documents[currentPage.size() - 1]
        val nextPage = query.startAfter(lastDocumentSnapshot)
            .get()
            .await()

        LoadResult.Page(
            data = currentPage.toObjects(Event::class.java),
            prevKey = null,
            nextKey = nextPage
        )
    } catch (e: Exception) {
        LoadResult.Error(e)
    }
}

override fun getRefreshKey(state: PagingState<QuerySnapshot, Event>): QuerySnapshot? {
    return null
}
}

这是我更新适配器的地方:

lifecycleScope.launchWhenStarted {
        viewModel.events.collectLatest {
            calendarEventsAdapter.submitData(it)
        }
    }
4

0 回答 0