0

Code Link
Video demo

I have created a nested expandable recycler view. when I click on an item it expands(set a part of view visible) and if it is already expanded it collapse. Only one item is expanded at a time. if I use visibility to gone or visible or use notifyItemChanged the recyclerview's items collapse or expand and while doing so they overlap. I don't want them to overlap while making UI changes

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)
        }
    }
}```

0 Answers0