// Signature format: 4.0
package androidx.recyclerview.widget {

  public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
    ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
    method public void onChanged(int, int, Object!);
    method public void onInserted(int, int);
    method public void onMoved(int, int);
    method public void onRemoved(int, int);
  }

  public final class AsyncDifferConfig<T> {
    method public java.util.concurrent.Executor getBackgroundThreadExecutor();
    method public androidx.recyclerview.widget.DiffUtil.ItemCallback<T!> getDiffCallback();
  }

  public static final class AsyncDifferConfig.Builder<T> {
    ctor public AsyncDifferConfig.Builder(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
    method public androidx.recyclerview.widget.AsyncDifferConfig<T!> build();
    method public androidx.recyclerview.widget.AsyncDifferConfig.Builder<T!> setBackgroundThreadExecutor(java.util.concurrent.Executor!);
  }

  public class AsyncListDiffer<T> {
    ctor public AsyncListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
    ctor public AsyncListDiffer(androidx.recyclerview.widget.ListUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T!>);
    method public void addListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
    method public java.util.List<T!> getCurrentList();
    method public void removeListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
    method public void submitList(java.util.List<T!>?);
    method public void submitList(java.util.List<T!>?, Runnable?);
  }

  public static interface AsyncListDiffer.ListListener<T> {
    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
  }

  public class AsyncListUtil<T> {
    ctor public AsyncListUtil(Class<T!>, int, androidx.recyclerview.widget.AsyncListUtil.DataCallback<T!>, androidx.recyclerview.widget.AsyncListUtil.ViewCallback);
    method public T? getItem(int);
    method public int getItemCount();
    method public void onRangeChanged();
    method public void refresh();
  }

  public abstract static class AsyncListUtil.DataCallback<T> {
    ctor public AsyncListUtil.DataCallback();
    method @WorkerThread public abstract void fillData(T![], int, int);
    method @WorkerThread public int getMaxCachedTiles();
    method @WorkerThread public void recycleData(T![], int);
    method @WorkerThread public abstract int refreshData();
  }

  public abstract static class AsyncListUtil.ViewCallback {
    ctor public AsyncListUtil.ViewCallback();
    method @UiThread public void extendRangeInto(int[], int[], int);
    method @UiThread public abstract void getItemRangeInto(int[]);
    method @UiThread public abstract void onDataRefresh();
    method @UiThread public abstract void onItemLoaded(int);
    field public static final int HINT_SCROLL_ASC = 2; // 0x2
    field public static final int HINT_SCROLL_DESC = 1; // 0x1
    field public static final int HINT_SCROLL_NONE = 0; // 0x0
  }

  public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
    ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
    method public void dispatchLastEvent();
    method public void onChanged(int, int, Object!);
    method public void onInserted(int, int);
    method public void onMoved(int, int);
    method public void onRemoved(int, int);
  }

  public final class ConcatAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder> {
    ctor @java.lang.SafeVarargs public ConcatAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!...);
    ctor @java.lang.SafeVarargs public ConcatAdapter(androidx.recyclerview.widget.ConcatAdapter.Config, androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>!...);
    ctor public ConcatAdapter(java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>>);
    ctor public ConcatAdapter(androidx.recyclerview.widget.ConcatAdapter.Config, java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>>);
    method public boolean addAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
    method public boolean addAdapter(int, androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
    method public java.util.List<? extends androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>> getAdapters();
    method public int getItemCount();
    method public void onBindViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
    method public androidx.recyclerview.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
    method public boolean onFailedToRecycleView(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public void onViewAttachedToWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public void onViewDetachedFromWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public boolean removeAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
  }

  public static final class ConcatAdapter.Config {
    field public static final androidx.recyclerview.widget.ConcatAdapter.Config DEFAULT;
    field public final boolean isolateViewTypes;
    field public final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode stableIdMode;
  }

  public static final class ConcatAdapter.Config.Builder {
    ctor public ConcatAdapter.Config.Builder();
    method public androidx.recyclerview.widget.ConcatAdapter.Config build();
    method public androidx.recyclerview.widget.ConcatAdapter.Config.Builder setIsolateViewTypes(boolean);
    method public androidx.recyclerview.widget.ConcatAdapter.Config.Builder setStableIdMode(androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode);
  }

  public enum ConcatAdapter.Config.StableIdMode {
    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode ISOLATED_STABLE_IDS;
    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode NO_STABLE_IDS;
    enum_constant public static final androidx.recyclerview.widget.ConcatAdapter.Config.StableIdMode SHARED_STABLE_IDS;
  }

  public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
    ctor public DefaultItemAnimator();
    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void endAnimations();
    method public boolean isRunning();
    method public void runPendingAnimations();
  }

  public class DiffUtil {
    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback);
    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback, boolean);
  }

  public abstract static class DiffUtil.Callback {
    ctor public DiffUtil.Callback();
    method public abstract boolean areContentsTheSame(int, int);
    method public abstract boolean areItemsTheSame(int, int);
    method public Object? getChangePayload(int, int);
    method public abstract int getNewListSize();
    method public abstract int getOldListSize();
  }

  public static class DiffUtil.DiffResult {
    method public int convertNewPositionToOld(@IntRange(from=0) int);
    method public int convertOldPositionToNew(@IntRange(from=0) int);
    method public void dispatchUpdatesTo(androidx.recyclerview.widget.RecyclerView.Adapter);
    method public void dispatchUpdatesTo(androidx.recyclerview.widget.ListUpdateCallback);
    field public static final int NO_POSITION = -1; // 0xffffffff
  }

  public abstract static class DiffUtil.ItemCallback<T> {
    ctor public DiffUtil.ItemCallback();
    method public abstract boolean areContentsTheSame(T, T);
    method public abstract boolean areItemsTheSame(T, T);
    method public Object? getChangePayload(T, T);
  }

  public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
    ctor public DividerItemDecoration(android.content.Context!, int);
    method public android.graphics.drawable.Drawable? getDrawable();
    method public void setDrawable(android.graphics.drawable.Drawable);
    method public void setOrientation(int);
    field public static final int HORIZONTAL = 0; // 0x0
    field public static final int VERTICAL = 1; // 0x1
  }

  public class GridLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
    ctor public GridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
    ctor public GridLayoutManager(android.content.Context!, int);
    ctor public GridLayoutManager(android.content.Context!, int, int, boolean);
    method public int getSpanCount();
    method public androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup! getSpanSizeLookup();
    method public boolean isUsingSpansToEstimateScrollbarDimensions();
    method public void setSpanCount(int);
    method public void setSpanSizeLookup(androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup!);
    method public void setUsingSpansToEstimateScrollbarDimensions(boolean);
    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
  }

  public static final class GridLayoutManager.DefaultSpanSizeLookup extends androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup {
    ctor public GridLayoutManager.DefaultSpanSizeLookup();
    method public int getSpanSize(int);
  }

  public static class GridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
    ctor public GridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
    ctor public GridLayoutManager.LayoutParams(int, int);
    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
    ctor public GridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
    method public int getSpanIndex();
    method public int getSpanSize();
    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
  }

  public abstract static class GridLayoutManager.SpanSizeLookup {
    ctor public GridLayoutManager.SpanSizeLookup();
    method public int getSpanGroupIndex(int, int);
    method public int getSpanIndex(int, int);
    method public abstract int getSpanSize(int);
    method public void invalidateSpanGroupIndexCache();
    method public void invalidateSpanIndexCache();
    method public boolean isSpanGroupIndexCacheEnabled();
    method public boolean isSpanIndexCacheEnabled();
    method public void setSpanGroupIndexCacheEnabled(boolean);
    method public void setSpanIndexCacheEnabled(boolean);
  }

  public class ItemTouchHelper extends androidx.recyclerview.widget.RecyclerView.ItemDecoration implements androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener {
    ctor public ItemTouchHelper(androidx.recyclerview.widget.ItemTouchHelper.Callback);
    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?);
    method public void onChildViewAttachedToWindow(android.view.View);
    method public void onChildViewDetachedFromWindow(android.view.View);
    method public void startDrag(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public void startSwipe(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    field public static final int ACTION_STATE_DRAG = 2; // 0x2
    field public static final int ACTION_STATE_IDLE = 0; // 0x0
    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
    field public static final int DOWN = 2; // 0x2
    field public static final int END = 32; // 0x20
    field public static final int LEFT = 4; // 0x4
    field public static final int RIGHT = 8; // 0x8
    field public static final int START = 16; // 0x10
    field public static final int UP = 1; // 0x1
  }

  public abstract static class ItemTouchHelper.Callback {
    ctor public ItemTouchHelper.Callback();
    method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
    method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public int convertToAbsoluteDirection(int, int);
    method public static int convertToRelativeDirection(int, int);
    method public long getAnimationDuration(androidx.recyclerview.widget.RecyclerView, int, float, float);
    method public int getBoundingBoxMargin();
    method public static androidx.recyclerview.widget.ItemTouchUIUtil getDefaultUIUtil();
    method public float getMoveThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public abstract int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public float getSwipeEscapeVelocity(float);
    method public float getSwipeThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public float getSwipeVelocityThreshold(float);
    method public int interpolateOutOfBoundsScroll(androidx.recyclerview.widget.RecyclerView, int, int, int, long);
    method public boolean isItemViewSwipeEnabled();
    method public boolean isLongPressDragEnabled();
    method public static int makeFlag(int, int);
    method public static int makeMovementFlags(int, int);
    method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
    method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
    method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
    method public abstract void onSwiped(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
  }

  public abstract static class ItemTouchHelper.SimpleCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback {
    ctor public ItemTouchHelper.SimpleCallback(int, int);
    method public int getDragDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public int getSwipeDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public void setDefaultDragDirs(int);
    method public void setDefaultSwipeDirs(int);
  }

  public static interface ItemTouchHelper.ViewDropHandler {
    method public void prepareForDrop(android.view.View, android.view.View, int, int);
  }

  public interface ItemTouchUIUtil {
    method public void clearView(android.view.View!);
    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
    method public void onSelected(android.view.View!);
  }

  public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
    ctor public LinearLayoutManager(android.content.Context!);
    ctor public LinearLayoutManager(android.content.Context!, int, boolean);
    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
    method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
    method public android.graphics.PointF! computeScrollVectorForPosition(int);
    method public int findFirstCompletelyVisibleItemPosition();
    method public int findFirstVisibleItemPosition();
    method public int findLastCompletelyVisibleItemPosition();
    method public int findLastVisibleItemPosition();
    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
    method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
    method public int getInitialPrefetchItemCount();
    method public int getOrientation();
    method public boolean getRecycleChildrenOnDetach();
    method public boolean getReverseLayout();
    method public boolean getStackFromEnd();
    method protected boolean isLayoutRTL();
    method public boolean isSmoothScrollbarEnabled();
    method public void prepareForDrop(android.view.View, android.view.View, int, int);
    method public void scrollToPositionWithOffset(int, int);
    method public void setInitialPrefetchItemCount(int);
    method public void setOrientation(int);
    method public void setRecycleChildrenOnDetach(boolean);
    method public void setReverseLayout(boolean);
    method public void setSmoothScrollbarEnabled(boolean);
    method public void setStackFromEnd(boolean);
    field public static final int HORIZONTAL = 0; // 0x0
    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
    field public static final int VERTICAL = 1; // 0x1
  }

  protected static class LinearLayoutManager.LayoutChunkResult {
    ctor protected LinearLayoutManager.LayoutChunkResult();
    field public int mConsumed;
    field public boolean mFinished;
    field public boolean mFocusable;
    field public boolean mIgnoreConsumed;
  }

  public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
    ctor public LinearSmoothScroller(android.content.Context!);
    method public int calculateDtToFit(int, int, int, int, int);
    method public int calculateDxToMakeVisible(android.view.View!, int);
    method public int calculateDyToMakeVisible(android.view.View!, int);
    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
    method protected int calculateTimeForDeceleration(int);
    method protected int calculateTimeForScrolling(int);
    method protected int getHorizontalSnapPreference();
    method protected int getVerticalSnapPreference();
    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
    method protected void onStart();
    method protected void onStop();
    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
    field public static final int SNAP_TO_ANY = 0; // 0x0
    field public static final int SNAP_TO_END = 1; // 0x1
    field public static final int SNAP_TO_START = -1; // 0xffffffff
    field protected final android.view.animation.DecelerateInterpolator! mDecelerateInterpolator;
    field protected int mInterimTargetDx;
    field protected int mInterimTargetDy;
    field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
    field protected android.graphics.PointF! mTargetVector;
  }

  public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
    ctor public LinearSnapHelper();
    method public int[]! calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
    method public android.view.View! findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
  }

  public abstract class ListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
    ctor protected ListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
    ctor protected ListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T!>);
    method public java.util.List<T!> getCurrentList();
    method protected T! getItem(int);
    method public int getItemCount();
    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
    method public void submitList(java.util.List<T!>?);
    method public void submitList(java.util.List<T!>?, Runnable?);
  }

  public interface ListUpdateCallback {
    method public void onChanged(int, int, Object?);
    method public void onInserted(int, int);
    method public void onMoved(int, int);
    method public void onRemoved(int, int);
  }

  public abstract class OrientationHelper {
    method public static androidx.recyclerview.widget.OrientationHelper! createHorizontalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
    method public static androidx.recyclerview.widget.OrientationHelper! createOrientationHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int);
    method public static androidx.recyclerview.widget.OrientationHelper! createVerticalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
    method public abstract int getDecoratedEnd(android.view.View!);
    method public abstract int getDecoratedMeasurement(android.view.View!);
    method public abstract int getDecoratedMeasurementInOther(android.view.View!);
    method public abstract int getDecoratedStart(android.view.View!);
    method public abstract int getEnd();
    method public abstract int getEndAfterPadding();
    method public abstract int getEndPadding();
    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! getLayoutManager();
    method public abstract int getMode();
    method public abstract int getModeInOther();
    method public abstract int getStartAfterPadding();
    method public abstract int getTotalSpace();
    method public int getTotalSpaceChange();
    method public abstract int getTransformedEndWithDecoration(android.view.View!);
    method public abstract int getTransformedStartWithDecoration(android.view.View!);
    method public abstract void offsetChild(android.view.View!, int);
    method public abstract void offsetChildren(int);
    method public void onLayoutComplete();
    field public static final int HORIZONTAL = 0; // 0x0
    field public static final int VERTICAL = 1; // 0x1
    field protected final androidx.recyclerview.widget.RecyclerView.LayoutManager! mLayoutManager;
  }

  public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
    ctor public PagerSnapHelper();
    method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
  }

  public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
    ctor public RecyclerView(android.content.Context);
    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?);
    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?, int);
    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration, int);
    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
    method public void addOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
    method public void addOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
    method public void addOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
    method public void addRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener);
    method public void clearOnChildAttachStateChangeListeners();
    method public void clearOnScrollListeners();
    method public int computeHorizontalScrollExtent();
    method public int computeHorizontalScrollOffset();
    method public int computeHorizontalScrollRange();
    method public int computeVerticalScrollExtent();
    method public int computeVerticalScrollOffset();
    method public int computeVerticalScrollRange();
    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
    method public final void dispatchNestedScroll(int, int, int, int, int[]!, int, int[]);
    method public boolean drawChild(android.graphics.Canvas!, android.view.View!, long);
    method public android.view.View? findChildViewUnder(float, float);
    method public android.view.View? findContainingItemView(android.view.View);
    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findContainingViewHolder(android.view.View);
    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForAdapterPosition(int);
    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! findViewHolderForItemId(long);
    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForLayoutPosition(int);
    method @Deprecated public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForPosition(int);
    method public boolean fling(int, int);
    method public androidx.recyclerview.widget.RecyclerView.Adapter? getAdapter();
    method public int getChildAdapterPosition(android.view.View);
    method public long getChildItemId(android.view.View);
    method public int getChildLayoutPosition(android.view.View);
    method @Deprecated public int getChildPosition(android.view.View);
    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! getChildViewHolder(android.view.View);
    method public androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate? getCompatAccessibilityDelegate();
    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
    method public androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory getEdgeEffectFactory();
    method @androidx.core.widget.EdgeEffectCompat.EdgeEffectType public int getEdgeEffectType();
    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator? getItemAnimator();
    method public androidx.recyclerview.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
    method public int getItemDecorationCount();
    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
    method public int getMaxFlingVelocity();
    method public int getMinFlingVelocity();
    method public androidx.recyclerview.widget.RecyclerView.OnFlingListener? getOnFlingListener();
    method public boolean getPreserveFocusAfterLayout();
    method public androidx.recyclerview.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
    method public int getScrollState();
    method public boolean hasFixedSize();
    method public boolean hasNestedScrollingParent(int);
    method public boolean hasPendingAdapterUpdates();
    method public void invalidateItemDecorations();
    method public boolean isAnimating();
    method public boolean isComputingLayout();
    method @Deprecated public boolean isLayoutFrozen();
    method public final boolean isLayoutSuppressed();
    method public void nestedScrollBy(int, int);
    method public void offsetChildrenHorizontal(@Px int);
    method public void offsetChildrenVertical(@Px int);
    method public void onChildAttachedToWindow(android.view.View);
    method public void onChildDetachedFromWindow(android.view.View);
    method public void onDraw(android.graphics.Canvas!);
    method public void onScrollStateChanged(int);
    method public void onScrolled(@Px int, @Px int);
    method public void removeItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
    method public void removeItemDecorationAt(int);
    method public void removeOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
    method public void removeOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
    method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
    method public void removeRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener);
    method public void scrollToPosition(int);
    method public void setAccessibilityDelegateCompat(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate?);
    method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?);
    method public void setChildDrawingOrderCallback(androidx.recyclerview.widget.RecyclerView.ChildDrawingOrderCallback?);
    method public void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
    method public void setEdgeEffectType(@androidx.core.widget.EdgeEffectCompat.EdgeEffectType int);
    method public void setHasFixedSize(boolean);
    method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
    method public void setItemViewCacheSize(int);
    method @Deprecated public void setLayoutFrozen(boolean);
    method public void setLayoutManager(androidx.recyclerview.widget.RecyclerView.LayoutManager?);
    method @Deprecated public void setLayoutTransition(android.animation.LayoutTransition!);
    method public void setOnFlingListener(androidx.recyclerview.widget.RecyclerView.OnFlingListener?);
    method @Deprecated public void setOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener?);
    method public void setPreserveFocusAfterLayout(boolean);
    method public void setRecycledViewPool(androidx.recyclerview.widget.RecyclerView.RecycledViewPool?);
    method @Deprecated public void setRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener?);
    method public void setScrollingTouchSlop(int);
    method public void setViewCacheExtension(androidx.recyclerview.widget.RecyclerView.ViewCacheExtension?);
    method public void smoothScrollBy(@Px int, @Px int);
    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?);
    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?, int);
    method public void smoothScrollToPosition(int);
    method public boolean startNestedScroll(int, int);
    method public void stopNestedScroll(int);
    method public void stopScroll();
    method public final void suppressLayout(boolean);
    method public void swapAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?, boolean);
    field public static final int HORIZONTAL = 0; // 0x0
    field public static final int INVALID_TYPE = -1; // 0xffffffff
    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
    field public static final int NO_POSITION = -1; // 0xffffffff
    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
    field public static final int VERTICAL = 1; // 0x1
  }

  public abstract static class RecyclerView.Adapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> {
    ctor public RecyclerView.Adapter();
    method public final void bindViewHolder(VH, int);
    method public final VH createViewHolder(android.view.ViewGroup, int);
    method public int findRelativeAdapterPositionIn(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>, androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
    method public abstract int getItemCount();
    method public long getItemId(int);
    method public int getItemViewType(int);
    method public final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy getStateRestorationPolicy();
    method public final boolean hasObservers();
    method public final boolean hasStableIds();
    method public final void notifyDataSetChanged();
    method public final void notifyItemChanged(int);
    method public final void notifyItemChanged(int, Object?);
    method public final void notifyItemInserted(int);
    method public final void notifyItemMoved(int, int);
    method public final void notifyItemRangeChanged(int, int);
    method public final void notifyItemRangeChanged(int, int, Object?);
    method public final void notifyItemRangeInserted(int, int);
    method public final void notifyItemRangeRemoved(int, int);
    method public final void notifyItemRemoved(int);
    method public void onAttachedToRecyclerView(androidx.recyclerview.widget.RecyclerView);
    method public abstract void onBindViewHolder(VH, int);
    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object!>);
    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
    method public void onDetachedFromRecyclerView(androidx.recyclerview.widget.RecyclerView);
    method public boolean onFailedToRecycleView(VH);
    method public void onViewAttachedToWindow(VH);
    method public void onViewDetachedFromWindow(VH);
    method public void onViewRecycled(VH);
    method public void registerAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
    method public void setHasStableIds(boolean);
    method public void setStateRestorationPolicy(androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy);
    method public void unregisterAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
  }

  public enum RecyclerView.Adapter.StateRestorationPolicy {
    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy ALLOW;
    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy PREVENT;
    enum_constant public static final androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy PREVENT_WHEN_EMPTY;
  }

  public abstract static class RecyclerView.AdapterDataObserver {
    ctor public RecyclerView.AdapterDataObserver();
    method public void onChanged();
    method public void onItemRangeChanged(int, int);
    method public void onItemRangeChanged(int, int, Object?);
    method public void onItemRangeInserted(int, int);
    method public void onItemRangeMoved(int, int, int);
    method public void onItemRangeRemoved(int, int);
    method public void onStateRestorationPolicyChanged();
  }

  public static interface RecyclerView.ChildDrawingOrderCallback {
    method public int onGetChildDrawingOrder(int, int);
  }

  public static class RecyclerView.EdgeEffectFactory {
    ctor public RecyclerView.EdgeEffectFactory();
    method protected android.widget.EdgeEffect createEdgeEffect(androidx.recyclerview.widget.RecyclerView, @androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection int);
    method protected android.widget.EdgeEffect createEdgeEffect(androidx.recyclerview.widget.RecyclerView, @androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection int, @androidx.core.widget.EdgeEffectCompat.EdgeEffectType int);
    field public static final int DIRECTION_BOTTOM = 3; // 0x3
    field public static final int DIRECTION_LEFT = 0; // 0x0
    field public static final int DIRECTION_RIGHT = 2; // 0x2
    field public static final int DIRECTION_TOP = 1; // 0x1
  }

  @IntDef({androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_LEFT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_TOP, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_RIGHT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_BOTTOM}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.EdgeEffectFactory.EdgeDirection {
  }

  public abstract static class RecyclerView.ItemAnimator {
    ctor public RecyclerView.ItemAnimator();
    method public abstract boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
    method public abstract boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
    method public abstract boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object!>);
    method public final void dispatchAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public final void dispatchAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public final void dispatchAnimationsFinished();
    method public abstract void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public abstract void endAnimations();
    method public long getAddDuration();
    method public long getChangeDuration();
    method public long getMoveDuration();
    method public long getRemoveDuration();
    method public abstract boolean isRunning();
    method public final boolean isRunning(androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener?);
    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
    method public void onAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public void onAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int, java.util.List<java.lang.Object!>);
    method public abstract void runPendingAnimations();
    method public void setAddDuration(long);
    method public void setChangeDuration(long);
    method public void setMoveDuration(long);
    method public void setRemoveDuration(long);
    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
    field public static final int FLAG_CHANGED = 2; // 0x2
    field public static final int FLAG_INVALIDATED = 4; // 0x4
    field public static final int FLAG_MOVED = 2048; // 0x800
    field public static final int FLAG_REMOVED = 8; // 0x8
  }

  @IntDef(flag=true, value={androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_CHANGED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_REMOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_MOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_INVALIDATED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_APPEARED_IN_PRE_LAYOUT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.ItemAnimator.AdapterChanges {
  }

  public static interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
    method public void onAnimationsFinished();
  }

  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder);
    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int);
    field public int bottom;
    field @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges public int changeFlags;
    field public int left;
    field public int right;
    field public int top;
  }

  public abstract static class RecyclerView.ItemDecoration {
    ctor public RecyclerView.ItemDecoration();
    method @Deprecated public void getItemOffsets(android.graphics.Rect, int, androidx.recyclerview.widget.RecyclerView);
    method public void getItemOffsets(android.graphics.Rect, android.view.View, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
    method @Deprecated public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
    method @Deprecated public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
  }

  public abstract static class RecyclerView.LayoutManager {
    ctor public RecyclerView.LayoutManager();
    method public void addDisappearingView(android.view.View!);
    method public void addDisappearingView(android.view.View!, int);
    method public void addView(android.view.View!);
    method public void addView(android.view.View!, int);
    method public void assertInLayoutOrScroll(String!);
    method public void assertNotInLayoutOrScroll(String!);
    method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
    method public void attachView(android.view.View, int);
    method public void attachView(android.view.View);
    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
    method public boolean canScrollHorizontally();
    method public boolean canScrollVertically();
    method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
    method public static int chooseSize(int, int, int);
    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
    method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
    method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
    method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
    method public int computeVerticalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
    method public int computeVerticalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
    method public int computeVerticalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
    method public void detachAndScrapAttachedViews(androidx.recyclerview.widget.RecyclerView.Recycler);
    method public void detachAndScrapView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
    method public void detachAndScrapViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
    method public void detachView(android.view.View);
    method public void detachViewAt(int);
    method public void endAnimation(android.view.View!);
    method public android.view.View? findContainingItemView(android.view.View);
    method public android.view.View? findViewByPosition(int);
    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
    method public int getBaseline();
    method public int getBottomDecorationHeight(android.view.View);
    method public android.view.View? getChildAt(int);
    method public int getChildCount();
    method @Deprecated public static int getChildMeasureSpec(int, int, int, boolean);
    method public static int getChildMeasureSpec(int, int, int, int, boolean);
    method public boolean getClipToPadding();
    method public int getColumnCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
    method public int getDecoratedBottom(android.view.View);
    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
    method public int getDecoratedLeft(android.view.View);
    method public int getDecoratedMeasuredHeight(android.view.View);
    method public int getDecoratedMeasuredWidth(android.view.View);
    method public int getDecoratedRight(android.view.View);
    method public int getDecoratedTop(android.view.View);
    method public android.view.View? getFocusedChild();
    method @Px public int getHeight();
    method public int getHeightMode();
    method public int getItemCount();
    method public int getItemViewType(android.view.View);
    method public int getLayoutDirection();
    method public int getLeftDecorationWidth(android.view.View);
    method @Px public int getMinimumHeight();
    method @Px public int getMinimumWidth();
    method @Px public int getPaddingBottom();
    method @Px public int getPaddingEnd();
    method @Px public int getPaddingLeft();
    method @Px public int getPaddingRight();
    method @Px public int getPaddingStart();
    method @Px public int getPaddingTop();
    method public int getPosition(android.view.View);
    method public static androidx.recyclerview.widget.RecyclerView.LayoutManager.Properties! getProperties(android.content.Context, android.util.AttributeSet?, int, int);
    method public int getRightDecorationWidth(android.view.View);
    method public int getRowCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
    method public int getSelectionModeForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
    method public int getTopDecorationHeight(android.view.View);
    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
    method @Px public int getWidth();
    method public int getWidthMode();
    method public boolean hasFocus();
    method public void ignoreView(android.view.View);
    method public boolean isAttachedToWindow();
    method public boolean isAutoMeasureEnabled();
    method public boolean isFocused();
    method public final boolean isItemPrefetchEnabled();
    method public boolean isLayoutHierarchical(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
    method public boolean isMeasurementCacheEnabled();
    method public boolean isSmoothScrolling();
    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
    method public void layoutDecorated(android.view.View, int, int, int, int);
    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
    method public void measureChild(android.view.View, int, int);
    method public void measureChildWithMargins(android.view.View, int, int);
    method public void moveView(int, int);
    method public void offsetChildrenHorizontal(@Px int);
    method public void offsetChildrenVertical(@Px int);
    method public void onAdapterChanged(androidx.recyclerview.widget.RecyclerView.Adapter?, androidx.recyclerview.widget.RecyclerView.Adapter?);
    method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
    method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
    method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
    method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
    method public void onInitializeAccessibilityNodeInfo(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
    method public void onInitializeAccessibilityNodeInfoForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
    method public android.view.View? onInterceptFocusSearch(android.view.View, int);
    method public void onItemsAdded(androidx.recyclerview.widget.RecyclerView, int, int);
    method public void onItemsChanged(androidx.recyclerview.widget.RecyclerView);
    method public void onItemsMoved(androidx.recyclerview.widget.RecyclerView, int, int, int);
    method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
    method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
    method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
    method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
    method public void onRestoreInstanceState(android.os.Parcelable!);
    method public android.os.Parcelable? onSaveInstanceState();
    method public void onScrollStateChanged(int);
    method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
    method public boolean performAccessibilityActionForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, int, android.os.Bundle?);
    method public void postOnAnimation(Runnable!);
    method public void removeAllViews();
    method public void removeAndRecycleAllViews(androidx.recyclerview.widget.RecyclerView.Recycler);
    method public void removeAndRecycleView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
    method public void removeAndRecycleViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
    method public boolean removeCallbacks(Runnable!);
    method public void removeDetachedView(android.view.View);
    method public void removeView(android.view.View!);
    method public void removeViewAt(int);
    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
    method public void requestLayout();
    method public void requestSimpleAnimationsInNextLayout();
    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
    method public void scrollToPosition(int);
    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
    method @Deprecated public void setAutoMeasureEnabled(boolean);
    method public final void setItemPrefetchEnabled(boolean);
    method public void setMeasuredDimension(android.graphics.Rect!, int, int);
    method public void setMeasuredDimension(int, int);
    method public void setMeasurementCacheEnabled(boolean);
    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
    method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
    method public void stopIgnoringView(android.view.View);
    method public boolean supportsPredictiveItemAnimations();
  }

  public static interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
    method public void addPosition(int, int);
  }

  public static class RecyclerView.LayoutManager.Properties {
    ctor public RecyclerView.LayoutManager.Properties();
    field public int orientation;
    field public boolean reverseLayout;
    field public int spanCount;
    field public boolean stackFromEnd;
  }

  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
    ctor public RecyclerView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
    ctor public RecyclerView.LayoutParams(int, int);
    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams!);
    ctor public RecyclerView.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
    method public int getAbsoluteAdapterPosition();
    method public int getBindingAdapterPosition();
    method @Deprecated public int getViewAdapterPosition();
    method public int getViewLayoutPosition();
    method @Deprecated public int getViewPosition();
    method public boolean isItemChanged();
    method public boolean isItemRemoved();
    method public boolean isViewInvalid();
    method public boolean viewNeedsUpdate();
  }

  public static interface RecyclerView.OnChildAttachStateChangeListener {
    method public void onChildViewAttachedToWindow(android.view.View);
    method public void onChildViewDetachedFromWindow(android.view.View);
  }

  public abstract static class RecyclerView.OnFlingListener {
    ctor public RecyclerView.OnFlingListener();
    method public abstract boolean onFling(int, int);
  }

  public static interface RecyclerView.OnItemTouchListener {
    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
    method public void onRequestDisallowInterceptTouchEvent(boolean);
    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
  }

  public abstract static class RecyclerView.OnScrollListener {
    ctor public RecyclerView.OnScrollListener();
    method public void onScrollStateChanged(androidx.recyclerview.widget.RecyclerView, int);
    method public void onScrolled(androidx.recyclerview.widget.RecyclerView, int, int);
  }

  public static class RecyclerView.RecycledViewPool {
    ctor public RecyclerView.RecycledViewPool();
    method public void clear();
    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? getRecycledView(int);
    method public int getRecycledViewCount(int);
    method public void putRecycledView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void setMaxRecycledViews(int, int);
  }

  public final class RecyclerView.Recycler {
    ctor public RecyclerView.Recycler();
    method public void bindViewToPosition(android.view.View, int);
    method public void clear();
    method public int convertPreLayoutPositionToPostLayout(int);
    method public java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!> getScrapList();
    method public android.view.View getViewForPosition(int);
    method public void recycleView(android.view.View);
    method public void setViewCacheSize(int);
  }

  public static interface RecyclerView.RecyclerListener {
    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
  }

  public static class RecyclerView.SimpleOnItemTouchListener implements androidx.recyclerview.widget.RecyclerView.OnItemTouchListener {
    ctor public RecyclerView.SimpleOnItemTouchListener();
    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
    method public void onRequestDisallowInterceptTouchEvent(boolean);
    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
  }

  public abstract static class RecyclerView.SmoothScroller {
    ctor public RecyclerView.SmoothScroller();
    method public android.graphics.PointF? computeScrollVectorForPosition(int);
    method public android.view.View! findViewByPosition(int);
    method public int getChildCount();
    method public int getChildPosition(android.view.View!);
    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
    method public int getTargetPosition();
    method @Deprecated public void instantScrollToPosition(int);
    method public boolean isPendingInitialRun();
    method public boolean isRunning();
    method protected void normalize(android.graphics.PointF);
    method protected void onChildAttachedToWindow(android.view.View!);
    method protected abstract void onSeekTargetStep(@Px int, @Px int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
    method protected abstract void onStart();
    method protected abstract void onStop();
    method protected abstract void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
    method public void setTargetPosition(int);
    method protected final void stop();
  }

  public static class RecyclerView.SmoothScroller.Action {
    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int);
    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int);
    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int, android.view.animation.Interpolator?);
    method public int getDuration();
    method @Px public int getDx();
    method @Px public int getDy();
    method public android.view.animation.Interpolator? getInterpolator();
    method public void jumpTo(int);
    method public void setDuration(int);
    method public void setDx(@Px int);
    method public void setDy(@Px int);
    method public void setInterpolator(android.view.animation.Interpolator?);
    method public void update(@Px int, @Px int, int, android.view.animation.Interpolator?);
    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
  }

  public static interface RecyclerView.SmoothScroller.ScrollVectorProvider {
    method public android.graphics.PointF? computeScrollVectorForPosition(int);
  }

  public static class RecyclerView.State {
    ctor public RecyclerView.State();
    method public boolean didStructureChange();
    method public <T> T! get(int);
    method public int getItemCount();
    method public int getRemainingScrollHorizontal();
    method public int getRemainingScrollVertical();
    method public int getTargetScrollPosition();
    method public boolean hasTargetScrollPosition();
    method public boolean isMeasuring();
    method public boolean isPreLayout();
    method public void put(int, Object!);
    method public void remove(int);
    method public boolean willRunPredictiveAnimations();
    method public boolean willRunSimpleAnimations();
  }

  public abstract static class RecyclerView.ViewCacheExtension {
    ctor public RecyclerView.ViewCacheExtension();
    method public abstract android.view.View? getViewForPositionAndType(androidx.recyclerview.widget.RecyclerView.Recycler, int, int);
  }

  public abstract static class RecyclerView.ViewHolder {
    ctor public RecyclerView.ViewHolder(android.view.View);
    method public final int getAbsoluteAdapterPosition();
    method @Deprecated public final int getAdapterPosition();
    method public final androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>? getBindingAdapter();
    method public final int getBindingAdapterPosition();
    method public final long getItemId();
    method public final int getItemViewType();
    method public final int getLayoutPosition();
    method public final int getOldPosition();
    method @Deprecated public final int getPosition();
    method public final boolean isRecyclable();
    method public final void setIsRecyclable(boolean);
    field public final android.view.View itemView;
  }

  public class RecyclerViewAccessibilityDelegate extends androidx.core.view.AccessibilityDelegateCompat {
    ctor public RecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView);
    method public androidx.core.view.AccessibilityDelegateCompat getItemDelegate();
  }

  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends androidx.core.view.AccessibilityDelegateCompat {
    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate);
  }

  public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
    ctor public SimpleItemAnimator();
    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
    method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
    method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
    method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
    method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public boolean getSupportsChangeAnimations();
    method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void onAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void onChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
    method public void onChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
    method public void onMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void onMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void onRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void onRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void setSupportsChangeAnimations(boolean);
  }

  public abstract class SnapHelper extends androidx.recyclerview.widget.RecyclerView.OnFlingListener {
    ctor public SnapHelper();
    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
    method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
    method public int[]! calculateScrollDistance(int, int);
    method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
    method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
    method public boolean onFling(int, int);
  }

  public class SortedList<T> {
    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>);
    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>, int);
    method public int add(T!);
    method public void addAll(T![], boolean);
    method public void addAll(T!...);
    method public void addAll(java.util.Collection<T!>);
    method public void beginBatchedUpdates();
    method public void clear();
    method public void endBatchedUpdates();
    method public T! get(int) throws java.lang.IndexOutOfBoundsException;
    method public int indexOf(T!);
    method public void recalculatePositionOfItemAt(int);
    method public boolean remove(T!);
    method public T! removeItemAt(int);
    method public void replaceAll(T![], boolean);
    method public void replaceAll(T!...);
    method public void replaceAll(java.util.Collection<T!>);
    method public int size();
    method public void updateItemAt(int, T!);
    field public static final int INVALID_POSITION = -1; // 0xffffffff
  }

  public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
    method public boolean areContentsTheSame(T2!, T2!);
    method public boolean areItemsTheSame(T2!, T2!);
    method public int compare(T2!, T2!);
    method public void dispatchLastEvent();
    method public void onChanged(int, int);
    method public void onInserted(int, int);
    method public void onMoved(int, int);
    method public void onRemoved(int, int);
  }

  public abstract static class SortedList.Callback<T2> implements java.util.Comparator<T2> androidx.recyclerview.widget.ListUpdateCallback {
    ctor public SortedList.Callback();
    method public abstract boolean areContentsTheSame(T2!, T2!);
    method public abstract boolean areItemsTheSame(T2!, T2!);
    method public abstract int compare(T2!, T2!);
    method public Object? getChangePayload(T2!, T2!);
    method public abstract void onChanged(int, int);
    method public void onChanged(int, int, Object!);
  }

  public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter!);
    method public void onChanged(int, int);
    method public void onInserted(int, int);
    method public void onMoved(int, int);
    method public void onRemoved(int, int);
  }

  public class StaggeredGridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
    ctor public StaggeredGridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
    ctor public StaggeredGridLayoutManager(int, int);
    method public android.graphics.PointF! computeScrollVectorForPosition(int);
    method public int[]! findFirstCompletelyVisibleItemPositions(int[]!);
    method public int[]! findFirstVisibleItemPositions(int[]!);
    method public int[]! findLastCompletelyVisibleItemPositions(int[]!);
    method public int[]! findLastVisibleItemPositions(int[]!);
    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
    method public int getGapStrategy();
    method public int getOrientation();
    method public boolean getReverseLayout();
    method public int getSpanCount();
    method public void invalidateSpanAssignments();
    method public void scrollToPositionWithOffset(int, int);
    method public void setGapStrategy(int);
    method public void setOrientation(int);
    method public void setReverseLayout(boolean);
    method public void setSpanCount(int);
    field @Deprecated public static final int GAP_HANDLING_LAZY = 1; // 0x1
    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
    field public static final int GAP_HANDLING_NONE = 0; // 0x0
    field public static final int HORIZONTAL = 0; // 0x0
    field public static final int VERTICAL = 1; // 0x1
  }

  public static class StaggeredGridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
    ctor public StaggeredGridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
    method public final int getSpanIndex();
    method public boolean isFullSpan();
    method public void setFullSpan(boolean);
    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
  }

}

