0

我正在使用FlexboxLayoutManager显示具有动态宽度的 Recycler View 项目。我面临的问题是,当项目的背景发生变化时,它会重新激活/重绘所有不太吸引人/需要的下一个项目。

我的屏幕截图

以下屏幕截图显示了用例。每当单行中有两个或多个不同宽度的项目时,选择/取消选择视图正在重新创建下一个邻居。

我的代码:

 val managerVal = FlexboxLayoutManager(context, FlexDirection.ROW)
// I have used these properties as well with other combinations showing here for reference
//            managerVal.alignItems = AlignItems.FLEX_START
//            managerVal.justifyContent = JustifyContent.CENTER
            itemView.rvFilterOptions.layoutManager = managerVal
val filterOptionAdapter = FilterOptionAdapter(
                context,
                record.values
            )
itemView.rvFilterOptions.adapter = filterOptionAdapter

我也尝试过更改适配器中的值

val lp = itemView.llFilterValue.getLayoutParams()
            if (lp is FlexboxLayoutManager.LayoutParams) {
               lp.flexGrow = 1.0f
               flexboxLp.flexShrink = 1f
               lp.alignSelf = AlignItems.FLEX_START

            }

更改适配器中项目背景的代码。

if (record.isSelected) {
                itemView.tvFilterValue.setTextColor(
                    AppCompatResources.getColorStateList(
                        context,
                        R.color.textWhite
                    )
                )
                itemView.ivFilterCheck.show()
                itemView.llFilterValue.background =
                    AppCompatResources.getDrawable(
                        context,
                        R.drawable.bg_dark_rectangle_circle_edge
                    )
            } else {
                itemView.tvFilterValue.setTextColor(
                    AppCompatResources.getColorStateList(
                        context,
                        R.color.textNormal
                    )
                )
                itemView.ivFilterCheck.invisible()
                itemView.llFilterValue.background =
                    AppCompatResources.getDrawable(
                        context,
                        R.drawable.bg_gray_rectangle_circle_edge
                    )
            }

显示行为的 gif:

在此处输入图像描述

感谢您的时间。

4

2 回答 2

1

所以修复最终出现在我的 XML 文件中。

Resoning:当您使用带有 flex-direction wrap的 flexbox 时,您允许 flexbox 库处理视图大小。由于我的用例位于嵌套回收器视图中,因此我的回收器视图项之一是使用 match_parent 属性,这会导致在运行时调整视图中的冲突(这会导致库级别的混乱)。

解决方案是简单地将 wrap_content 与 flexbox 一起使用,让库为视图测量做出决定。

于 2020-02-18T14:10:59.207 回答
1

我遇到了同样的问题,我认为这是因为我在我的onBindViewHolder函数中通过 DataBinding 在 xml 布局文件中设置了一个变量,导致TextView重新创建了我的布局文件。这似乎会导致布局管理器重新计算视图是否应该换行,即使文本没有更改。

所以我想更新视图而不调用我的正常绑定函数。每当我想将项目标记为选中时,我通过使用有效负载来解决它notifyItemChanged,例如:

notifyItemChanged(position: Int, payload: Any?)

由于您要发送有效负载,因此您需要覆盖

onBindViewHolder(holder: MyViewHolder, position: Int, payloads: MutableList<Any>)

需要注意的是,这个函数是 RecyclerView 总是调用的,所以如果你没有有效载荷,你需要调用超级函数,或者常规的onBindViewHolder,例如:

override fun onBindViewHolder(holder: MyViewHolder, position: Int, payloads: MutableList<Any>) {
    if (payloads.isEmpty()) return super.onBindViewHolder(holder, position, payloads)
    // I know that I called notifyItemChanged with a Boolean as payload to set the selected state.
    holder.updateSelectedState(payloads.firstOrNull() as? Boolean ?: false)
}

然后updateSelectedState我只是更新背景或图像视图,而不是项目(或者,可能是任何可能与布局宽度混淆的东西)。

于 2021-08-25T13:12:14.670 回答