所以我有一个 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)
}
}