0

我想将 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。

4

0 回答 0