flexbox-layout icon indicating copy to clipboard operation
flexbox-layout copied to clipboard

Justify content is broken

Open vovkab opened this issue 4 years ago • 0 comments

Description

After FlexboxLayoutManager is restored from saved state, i.e. fragment is re added via ViewPager all items are shifted up or down.

When FlexboxLayoutManager saves state, it saves getDecoratedLeft() to mAnchorOffset and after restore it eventually applies left to childTop so all children is shifted up or down

Issues and steps to reproduce

Preconditions

  1. Create new fragment with a RecyclerView:
recyclerView.layoutManager = FlexboxLayoutManager(context).apply {
  flexDirection = FlexDirection.ROW
  flexWrap = FlexWrap.NOWRAP
  justifyContent = JustifyContent.SPACE_EVENLY
}
  1. Re add fragment to force FlexboxLayoutManager to be restored from saved instance

Demo

flexbox-space-evenly-bug

When items are added the first time top is 0:

MyTextView@3d17f07 layout: l = [123], t = [0], r = [237], b = [75]
MyTextView@ba1665d layout: l = [483], t = [0], r = [597], b = [75]
MyTextView@17d04a3 layout: l = [843], t = [0], r = [957], b = [75]
MyTextView@3d17f07 layout: l = [123], t = [0], r = [237], b = [75]
MyTextView@ba1665d layout: l = [483], t = [0], r = [597], b = [75]
MyTextView@17d04a3 layout: l = [843], t = [0], r = [957], b = [75]
MyTextView@3d17f07 layout: l = [123], t = [0], r = [237], b = [75]
MyTextView@ba1665d layout: l = [483], t = [0], r = [597], b = [75]
MyTextView@17d04a3 layout: l = [843], t = [0], r = [957], b = [75]

When flex box is restored from saved instance top is now equals fist item left value, i.e. 123:

MyTextView@824fdfc layout: l = [123], t = [123], r = [237], b = [198]
MyTextView@d49dada layout: l = [483], t = [123], r = [597], b = [198]
MyTextView@6c1fde8 layout: l = [843], t = [123], r = [957], b = [198]
MyTextView@824fdfc layout: l = [123], t = [48], r = [237], b = [123]
MyTextView@d49dada layout: l = [483], t = [48], r = [597], b = [123]
MyTextView@6c1fde8 layout: l = [843], t = [48], r = [957], b = [123]
MyTextView@824fdfc layout: l = [123], t = [123], r = [237], b = [198]
MyTextView@d49dada layout: l = [483], t = [123], r = [597], b = [198]
MyTextView@6c1fde8 layout: l = [843], t = [123], r = [957], b = [198]
MyTextView@824fdfc layout: l = [123], t = [48], r = [237], b = [123]
MyTextView@d49dada layout: l = [483], t = [48], r = [597], b = [123]
MyTextView@6c1fde8 layout: l = [843], t = [48], r = [957], b = [123]

Affected JustifyContent:

  • SPACE_AROUND
  • CENTER
  • SPACE_EVENLY
  • FLEX_END

Note: the only one that is working fine is FLEX_START and SPACE_BETWEEN

Expected behavior

All items should be shown

Version of the flexbox library

  • 1.1.0
  • 2.0.1

Workaround

There is a temporary workaround that may not work for everyone - disable save state:

recyclerView.isSaveEnabled = false

Link to code

https://github.com/vovkab/flexbox-space-evenly-bug

Original video:

https://drive.google.com/file/d/1D7MRqiUx2kRfvAHp4AJKJcRI_l73Eobx/view?usp=sharing

vovkab avatar Mar 31 '20 01:03 vovkab