我想将 updateAsync 与我的 ExpandableGroup 一起使用,经过数小时的挫折和查看示例后,我仍然无法找到方法。
这是我找到的最接近的答案,但它无法指导我使用 ExpandableGroup 进行 updateAsync:https ://github.com/lisawray/groupie/issues/189
这是我的用于 ShoppingListFragment 的 ExpandableGroup 的代码,孩子是成分。recipeList 是从数据库中获取的。如果我从 ShoppingListFragment 中删除食谱,我可以传递位置并使用 groupAdapter.removeGroupAtAdapterPosition(position)。但是,如果我从另一个片段的数据库中删除食谱,我将无法传递位置......因此,让 groupAdapter 在 ShoppingListFragment 中实际反映此删除的唯一方法是导航到另一个片段并返回。我尝试了 groupAdapter.notifyDataSetChanged() ,但它不起作用。如果有人有任何建议/解决方法,请告诉我。
viewModel.state.observe(viewLifecycleOwner, {state->
for (recipe in state.recipeList) {
val expandableHeaderItem = ExpandableHeaderItem(
recipe = recipe,
viewLifecycleOwner,
this@ShoppingListFragment,
viewModel.shoppingListInteractionManager.selectedRecipe,
context!!
)
groupAdapter.apply {
groupAdapter.add(
ExpandableGroup(
expandableHeaderItem,
recipe.isExpanded
).apply {
for (ingredient in recipe.recipeIngredientCheck!!) {
add(
IngredientItem(
ingredient,
this@ShoppingListFragment,
ingredient.isChecked
) { item, favorite ->
item.setFavorite(favorite)
item.notifyChanged(IngredientItem.FAVORITE)
})
}
})
}
}
})
又过了几个小时,我决定在检测到数据库大小差异时强制recyclerview 刷新。这绝对不是理想的解决方案,我肯定想要一个使用 updateAsync 的解决方案。
private fun fetchShoppingList() {
state.value?.let {state->
fetchShoppingListRecipes.execute().onEach {dataState ->
dataState.data?.let { list->
val initialSize = list.size
if(state.initialListSize != initialSize) {
state.initialListSize = list.size
setNeedToReloadToTrue()
this.state.value = state.copy(recipeList = list)
setNeedToReloadToFalse()
} else if (state.initialListSize == initialSize) {
setNeedToReloadToFalse()
}
}
}.launchIn(viewModelScope)
}
}
private fun setNeedToReloadToTrue() {
state.value?.needToReload = true
}
private fun setNeedToReloadToFalse() {
state.value?.needToReload = false
}
在片段中,我在“needToReload”布尔值上放置了一个观察者,并在需要重新加载为真时让它重新初始化 groupie 适配器和 recycleriew。