doOnPreDraw method not getting called for some items in a recyclerView

Viewed 816

I'm having troubles with some animation in a recycler view. I do the relevant measurements in onViewAttachedToWindow:

override fun onViewAttachedToWindow(holder: PairingViewHolder) {
        super.onViewAttachedToWindow(holder)

        // get originalHeight & expandedHeight if not gotten before
        if (holder.expandedHeight < 0) {
            // Execute pending bindings, otherwise the measurement will be wrong.
            holder.itemViewDataBinding.executePendingBindings()
            holder.cardContainer.layoutParams.width = expandedWidth
            holder.expandedHeight = 0 // so that this block is only called once

            holder.cardContainer.doOnLayout { view ->

                holder.originalHeight = view.height
                holder.expandView.isVisible = true

                // show expandView and record expandedHeight in next layout pass
                // (doOnPreDraw) and hide it immediately.
                view.doOnPreDraw {
                    holder.expandedHeight = view.height
                    holder.expandView.isVisible = false
                    holder.cardContainer.layoutParams.width = originalWidth
                }
            }
        }
    }

The problem is that doOnPreDraw gets called just for some views. It is something related to the visibility of the views I guess, since the smaller the items (expanded) are, the highest the count of the ones on which onPreDraw gets called.

My guess is that since I'm expanding them in onLayout, the recyclerView consider visible only the ones that when expanded are actually visible on screen. In onPreDraw I collapse them, resulting in some views being able to animate correctly and some not.

How would you solve this?

Thanks in advance.

0 Answers
Related