- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用Paging 3
图书馆获取Flow<PagingData<Scan>>
来自Room
,然后检查是否在 recyclerview 中选择了项目,因此我将此类映射到另一个名为 ScanMapper
的类。为了实现此映射,每当用户将某个项目标记为选定时,我都会更新 Map
里面 MutableStateFlow<Map<Int, State>>
。这里是Map
查找 Index(Int)
获取 State
, State
只是一个 enum
代表状态的类 UNINITIALISED
, USELECTED
和SELECTED
.
我将 map 的值设置为 StateFlow<Map<Int,State>>
。问题是,我试图结合 Flow<PagingData<Scan>>
与 StateFlow<Map<Int,State>>
为了也通过 State
作为 ScanMapper
的参数自此上课State
取自StateFlow<Map<Int,State>>
并且不是原始 Scan
的一部分类(class)。但是PagingDataAdapter
似乎总是得到 State UNINITIALISED
尽管当我将项目标记为在项目上选择时,单击使用 markSelected(scanId: Int)
功能。
请告诉我我在这里缺少什么。
更新
我能够通过使用 Flow<List<Scan>>
实现我想要的功能并删除 Paging 3
的使用使用带有 DiffUtils
的回收器适配器的库。尽管这不是实际的解决方案,因为它消除了 pagination using paging 3
库,但以下更改允许我执行项目选择:
更新了 Dao
@Query("SELECT * FROM scan ORDER BY timeOfStorage DESC")
fun getAllScansList(): Flow<List<Scan>>
更新了 ViewModel 中的函数
fun getData(context: Context): Flow<List<ScanMapper>> {
val dao = ScanDatabase.invoke(context).getScanDao()
return combine(
dao.getAllScansList(),
myMap
) { scan, stateMap ->
scan.map {
it.toScanMapper(stateMap[it.id] ?: State.UNKNOWN)
}
}.flatMapLatest {
flow {
emit(it)
}
}
}
更新了 fragment 代码
mainViewModel.getData(requireContext()).collect {
adapter.asyncListDiffer.submitList(it as MutableList)
}
原始问题
我的扫描类(class):
@Entity(tableName = "scan")
@Parcelize
data class Scan (
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
val name: String,
val recognisedText: String,
val timeOfStorage: Long,
val filename: String
): Parcelable {
}
我的 ScanMapper 类:
data class ScanMapper(
val id: Int,
val name: String,
val recognisedText: String,
val timeOfStorage: Long,
val filename: String,
val isSelected: State
)
enum class State{
UNINITIALISED,
SELECTED,
UNSELECTED,
UNKNOWN
}
扫描到 ScanMapper 的转换器,反之亦然
fun ScanMapper.mapToScan() =
Scan(
id = id,
name = name,
recognisedText = recognisedText,
timeOfStorage = timeOfStorage,
filename = filename
)
fun Scan.toScanMapper(isSelected: State) =
ScanMapper(
id = id,
name = name,
recognisedText = recognisedText,
timeOfStorage = timeOfStorage,
filename = filename,
isSelected = isSelected
)
Dao 中的我的 PagingSource
@Query("SELECT * FROM scan ORDER BY timeOfStorage DESC")
fun getAllScans(): PagingSource<Int,Scan>
@Query("SELECT id FROM scan")
fun getAllIds(): List<Int>
使用 getScansFlow() 获取流量
fun getScansFlow(context: Context): Flow<PagingData<Scan>> {
val scanDao = ScanDatabase.invoke(context).getScanDao()
return Pager(
config = PagingConfig(
pageSize = 10,
maxSize = 30,
enablePlaceholders = false
),
pagingSourceFactory = { scanDao.getAllScans() }
).flow.cachedIn(viewModelScope)
}
初始化房间中存在的 ID 的 map
fun initList() =
viewModelScope.launch {
var idList: List<Int> = listOf()
withContext(Dispatchers.IO) {
val task = async {
return@async ScanDatabase.invoke(context).getScanDao().getAllIds()
}
idList = task.await()
}
val map = _myMap.value.toMutableMap()
for (id in idList) {
map[id] = State.UNINITIALISED
}
_myMap.value = map
}
ViewModel 中获取流程并将其组合的函数
fun getScansSyncFlow(context: Context) {
viewModelScope.launch {
combine(
getScansFlow(context),
myMap
) { scan, stateMap ->
scan.map {
it.toScanMapper(stateMap[it.id] ?: State.UNKNOWN)
}
}.collect{
_myFlow.emit(it)
}
}
}
myFlow
是 StateFlow<PagingData<ScanMapper>?>
.
这就是我更新 Map
的方式当用户在 recyclerview 中选择某个项目时。
fun markSelected(scanId: Int) {
val map = _myMap.value.toMutableMap()
map[scanId] = State.SELECTED
_myMap.value = map
}
那么,我正在收集这个myFlow
在我的fragment
像这样:
lifecycleScope.launchWhenStarted {
mainViewModel.getScansSyncFlow(requireContext())
mainViewModel.myFlow.collect { data ->
data?.let {
adapter.submitData(it)
}
}
}
最佳答案
我看到的直接问题是您使用的是collect 而不是collectLatest。由于 SubmitData 不会返回,因此您将永远不会收到来自 Flow 的更新。
mainViewModel.myFlow.collectLatest {
adapter.submitData(it)
}
关于android - Room 分页无法正确地将 Flow<PagingData<Model>> 与其他流合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67495592/
我有一个 pagingData 流对象,我想将它与不同的融合位置流结合起来,以便它与 pagingdata 列表中的每个项目进行相应的处理。 val point : Flow val pagingDa
后台线程是否使用 PagingData 自动管理?与 PagedList 一样,然后在主线程上返回? 从下面的日志中,它出现了 PagingData与 PagedList 相比,不在 Paging 3
我的 ViewModel 有一个返回 PagingData 流的方法。在我的应用程序中,数据是从远程服务器获取的,然后保存到 Room(单一真实来源): fun getChocolates(): Fl
我正在使用分页库从 api 检索数据并将它们显示在列表中 为此,我在我的存储库中创建了该方法:fun getArticleList(query: String): Flow>在我的 View 模型中,
我正在尝试使用Paging 3图书馆获取Flow>来自Room ,然后检查是否在 recyclerview 中选择了项目,因此我将此类映射到另一个名为 ScanMapper 的类。为了实现此映射,每当
我正在使用新的 jetpack Paging 3 库。我有一个特定的用例。我想使用 viewmodel 在两个屏幕之间共享这些数据。 一个屏幕需要分页数据,而对于第二个屏幕,我想要此数据的简单列表(不
我如何才能获得当前的项目数量,即我的 PagingData持有?我找到的唯一解决方案是调用 shopListAdapter.itemCount但这总是返回 0。 我要做的是:获取我的 PagingAd
我是一名优秀的程序员,十分优秀!