使用 set visibility 和 notifyItemChanged 调用时嵌套的可扩展 recyclerview 出现 UI 故障,项目在转换时相互重叠

问题描述 投票:0回答:0

代码链接
视频演示

我创建了一个嵌套的可扩展回收器视图。当我单击一个项目时,它会展开(将视图的一部分设置为可见),如果它已经展开,则会折叠。一次只展开一项。如果我使用 visibility 来 gone 或 visible 或使用 notifyItemChanged,recyclerview 的项目会折叠或展开,并且在这样做时它们会重叠。我不希望它们在进行 UI 更改时重叠

class RedeemSectionAdapter(
    private val redeemData: List<Redeem>,
    preExpandedViewPosition: Int = 1
) : RecyclerView.Adapter<RedeemSectionAdapter.RedeemSectionViewHolder>() {

    companion object {
        var expandedViewPosition = -1
    }

    init {
        expandedViewPosition = preExpandedViewPosition
    }

    class RedeemSectionViewHolder(
        private val binding: GiftCardRedeemSectionBinding
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(
            position: Int,
            redeemSection: Redeem,
            onClickCallBack: (index: Int) -> Unit
        ) {
            with(binding) {
                stepsRecyclerView.layoutManager = LinearLayoutManager(binding.root.context)
                stepsRecyclerView.adapter = RedeemStepsAdapter(redeemSteps = redeemSection.redeemSteps)
                sectionListDivider.visibility = if (position == 0) View.INVISIBLE else View.VISIBLE
                sectionHeader.text = redeemSection.sectionHeader
                val drawIcon =
                    if (expandedViewPosition == position) R.drawable.ic_up_arrow else R.drawable.ic_down_arrow
                sectionHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, drawIcon, 0)
                stepsRecyclerView.visibility = if(position == expandedViewPosition) View.VISIBLE else View.GONE
            }
            binding.root.setOnClickListener {
                if (expandedViewPosition == position) {
                    expandedViewPosition = -1
                } else {
                    val currentExpandedItemPosition = expandedViewPosition
                    expandedViewPosition = position
                    if(currentExpandedItemPosition > -1)
                        onClickCallBack(currentExpandedItemPosition)
                }
                onClickCallBack(position)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RedeemSectionViewHolder {
        val binding =
            GiftCardRedeemSectionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return RedeemSectionViewHolder(binding)
    }

    override fun getItemCount() = redeemData.size

    override fun onBindViewHolder(holder: RedeemSectionViewHolder, position: Int) {
        holder.bind(position, redeemData[position]) { index: Int ->
            notifyItemChanged(index)
        }
    }
}```
android kotlin android-recyclerview notifydatasetchanged nestedrecyclerview
© www.soinside.com 2019 - 2024. All rights reserved.