isAutoMeasureEnabled

Returns whether the measuring pass of layout should use the AutoMeasure mechanism of RecyclerView or if it should be done by the LayoutManager's implementation of onMeasure.

This method returns false by default (it actually returns the value passed to the deprecated setAutoMeasureEnabled) and should be overridden to return true if a LayoutManager wants to be auto measured by the RecyclerView.

If this method is overridden to return true, onMeasure should not be overridden.

AutoMeasure is a RecyclerView mechanism that handles the measuring pass of layout in a simple and contract satisfying way, including the wrapping of children laid out by LayoutManager. Simply put, it handles wrapping children by calling onLayoutChildren during a call to onMeasure, and then calculating desired dimensions based on children's dimensions and positions. It does this while supporting all existing animation capabilities of the RecyclerView.

More specifically:

  1. When onMeasure is called, if the provided measure specs both have a mode of EXACTLY, RecyclerView will set its measured dimensions accordingly and return, allowing layout to continue as normal (Actually, RecyclerView will call onMeasure for backwards compatibility reasons but it should not be overridden if AutoMeasure is being used).
  2. If one of the layout specs is not EXACT, the RecyclerView will start the layout process. It will first process all pending Adapter updates and then decide whether to run a predictive layout. If it decides to do so, it will first call onLayoutChildren with isPreLayout set to true. At this stage, getWidth and getHeight will still return the width and height of the RecyclerView as of the last layout calculation.

    After handling the predictive case, RecyclerView will call onLayoutChildren with isMeasuring set to true and isPreLayout set to false. The LayoutManager can access the measurement specs via getHeight, getHeightMode, getWidth and getWidthMode.

  3. After the layout calculation, RecyclerView sets the measured width &height by calculating the bounding box for the children (+ RecyclerView's padding). The LayoutManagers can override setMeasuredDimension to choose different values. For instance, GridLayoutManager overrides this value to handle the case where if it is vertical and has 3 columns but only 2 items, it should still measure its width to fit 3 items, not 2.
  4. Any following calls to onMeasure will run onLayoutChildren with isMeasuring set to true and isPreLayout set to false. RecyclerView will take care of which views are actually added / removed / moved / changed for animations so that the LayoutManager should not worry about them and handle each onLayoutChildren call as if it is the last one.
  5. When measure is complete and RecyclerView's onLayout method is called, RecyclerView checks whether it already did layout calculations during the measure pass and if so, it re-uses that information. It may still decide to call onLayoutChildren if the last measure spec was different from the final dimensions or adapter contents have changed between the measure call and the layout call.
  6. Finally, animations are calculated and run as usual.

Return

True if the measuring pass of layout should use the AutoMeasure mechanism of RecyclerView or False if it should be done by the LayoutManager's implementation of onMeasure.

See also