如何在Recyclerview中仅刷新列表的一部分

马丁1337

RecyclerView在使用5适配器的地方很复杂ViewHolders我创建了类似于“联系人列表”的自定义部分。但是在我的recyclerView中,一个区域中的项目可以重置其他区域中的所有内容。但是我不知道该怎么做。

我现在正在做的是擦除整个适配器列表并再次添加项,但这不是有效的方法。里面的项目也Section 1包含CheckBox,如果选中,则可以清除Section 2和中的所有数据Section 3

OnCheckedChangeListenerCheckBoxitemList[pos]状态设置状态;从状态设置状态onBindViewHolder(在绑定开始时检查部分内部的默认选中项目)。如果选中,则将刷新整个列表并调用notifyDataSetChanged这样做是因为不同部分中的所有其他项目都是基于第一部分中的选中项目。

由于导致崩溃concurrent modification exception每当这些项目之一再次绑定到onBindViewHolder选中的更改侦听器内时,就会触发并刷新整个列表。如果连续两次或更多次调用,它将使我的应用程序崩溃。同样,如果用户将上下滚动并且Section1项目开始重新出现和消失,它将在一行中多次调用onBindViewHolder =>多次调用notifyDataSetChanged()=>异常。

AndroidRecyclerView确实缺乏对部分的本地支持。仅在开始时设置子数组之类的子数组然后调用adapter.updateSection(1)例如,这真的很酷

如果我可以RecyclerView为每个部分单独设置这也会更好,但是整个RecyclerView必须是可滚动的。加入4RecyclerViews里面NestedScrollView会杀回收机制。

用于刷新项目的代码预览:

val selectedVariantFirstSectionJSONObject = getSelectedVariantInJSON(selectedVariantID)
        ingredientsItemList.apply {
            clear()
            add(IngredientHeaderItemNonIconified(getString(R.string.food_ingredients_variant_label)))
            addAll(foodVariantsArray)
            add(IngredientSectionSeparator())
            add(IngredientHeaderItemNonIconified(getString(R.string.food_ingredients_required_ingredients_label)))
            add(RequiredIngredient(getVariantRequiredIngredients(selectedVariantJSONObject.getJSONArray(getString(R.string.food_variant_required_ingredients)))))
            add(IngredientSectionSeparator())
            add(IngredientHeaderItemIconified(getString(R.string.food_ingredients_remove_ingredients_label), TYPE_INGREDIENT_REM))
            addAll(removableIngredients)
            add(IngredientSectionSeparator())
            add(IngredientHeaderItemIconified(getString(R.string.food_ingredients_add_ingredients_label), TYPE_INGREDIENT_OPT))
            addAll(optionalIngredients)
        }

adapter.notifyDataSetChanged()

便于理解的图片(有点复杂):

在此处输入图片说明

lvl4fi4

RvAdapter.notifyItemRangeChanged(start,count);如果有的话,您可以简单地为子适配器调用和相同的东西

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使 RecyclerView 的 ItemTouchHelper 仅作用于列表的一部分(拖放)

如何仅提取列表中每个元素的一部分?

如何在recyclerview中隐藏字符串的一部分?

如何在Java中仅下载txt文件的一部分?

如何在ffmpeg中仅输入视频文件的一部分

如何在SQL中仅显示VARCHAR的一部分

如何在 ASP/VBScript 中仅提取“For Each”循环的一部分

如何在matplotlib中仅使用和绘制颜色栏的一部分?

如何在laravel 5.2中仅显示字符串的一部分?

如何在纯 JS 中仅操作 JSON 对象的一部分?

如何在javascript中仅旋转画布的一部分?

如何在反应中仅导入一部分json文件?

如何在 WPF 中仅绘制 Bezier 曲线的一部分?

如何在 boost::asio 中仅读取 udp 套接字的一部分?

如何在PHP中仅回显数据的一部分?

如何在 Spring Data jpa 中仅修改实体的一部分?

如何在OCaml / ReasonML中获取列表的一部分?

如何在RDD中总结列表的一部分

如何在返回值中获取列表的一部分

如何在python列表中删除字符串的一部分?

经过时间列-如何仅刷新StructuredViewer的一部分

如何在 nodejs 中仅加密整个文件的一部分(例如:仅前 2500 个字节)?

如何仅解析JSON的一部分?

如何仅编码URL的一部分

如何仅显示图像的一部分

如何仅更改状态的一部分?

如何仅分析图像的一部分?

如何仅渲染Sprite的一部分

如何仅加粗段落的一部分?