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