@Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int space = (int) Math.ceil(8 * Resources.getSystem().getDisplayMetrics().density); // 8 dp int position = parent.getChildAdapterPosition(view); if (position < 2) { outRect.top = space; } if ((position + 1) % 2 == 0) { outRect.right = space; } outRect.bottom = outRect.left = space; } }
private int findFirstVisibleItemPosition(RecyclerView recyclerView) { final View child = findOneVisibleChild(0, mLayoutManager.getChildCount(), false, true); return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child); }
private int findLastVisibleItemPosition(RecyclerView recyclerView) { final View child = findOneVisibleChild(recyclerView.getChildCount() - 1, -1, false, true); return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child); }
private int findLastVisibleItemPosition(RecyclerView recyclerView) { final View child = findOneVisibleChild(recyclerView.getChildCount() - 1, -1, false, true); return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child); }
private int findFirstVisibleItemPosition(RecyclerView recyclerView) { final View child = findOneVisibleChild(0, mLayoutManager.getChildCount(), false, true); return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child); }
mDimensionCalculator.initMargins(mTempRect1, header); int adapterPosition = parent.getChildAdapterPosition(item); if (adapterPosition == RecyclerView.NO_POSITION || mHeaderProvider.getHeader(parent, adapterPosition) != header) {
private void loadNextItemsIfNeeded(RecyclerView recyclerView) { if (!isLoading && !isError) { View lastVisibleChild = recyclerView.getChildAt(recyclerView.getChildCount() - 1); int lastVisiblePos = recyclerView.getChildAdapterPosition(lastVisibleChild); int total = getItemCount(); if (lastVisiblePos >= total - loadingOffset) { // We need to use runnable, since recycler view does not like when we are notifying // about changes during scroll callback. recyclerView.post(this::loadNextItems); } } }
private boolean isStickyHeaderBeingPushedOffscreen(RecyclerView recyclerView, View stickyHeader) { View viewAfterHeader = getFirstViewUnobscuredByHeader(recyclerView, stickyHeader); int firstViewUnderHeaderPosition = recyclerView.getChildAdapterPosition(viewAfterHeader); if (firstViewUnderHeaderPosition == RecyclerView.NO_POSITION) { return false; } boolean isReverseLayout = mOrientationProvider.isReverseLayout(recyclerView); if (firstViewUnderHeaderPosition > 0 && hasNewHeader(firstViewUnderHeaderPosition, isReverseLayout)) { View nextHeader = mHeaderProvider.getHeader(recyclerView, firstViewUnderHeaderPosition); mDimensionCalculator.initMargins(mTempRect1, nextHeader); mDimensionCalculator.initMargins(mTempRect2, stickyHeader); if (mOrientationProvider.getOrientation(recyclerView) == LinearLayoutManager.VERTICAL) { int topOfNextHeader = viewAfterHeader.getTop() - mTempRect1.bottom - nextHeader.getHeight() - mTempRect1.top; int bottomOfThisHeader = recyclerView.getPaddingTop() + stickyHeader.getBottom() + mTempRect2.top + mTempRect2.bottom; if (topOfNextHeader < bottomOfThisHeader) { return true; } } else { int leftOfNextHeader = viewAfterHeader.getLeft() - mTempRect1.right - nextHeader.getWidth() - mTempRect1.left; int rightOfThisHeader = recyclerView.getPaddingLeft() + stickyHeader.getRight() + mTempRect2.left + mTempRect2.right; if (leftOfNextHeader < rightOfThisHeader) { return true; } } } return false; }
@Override public void onChildViewAttachedToWindow(View view) { final ID id = getAnimator() == null ? null : getAnimator().getRequestedId(); // If view was requested and list is scrolled we should try to find the view again if (id != null) { int position = list.getChildAdapterPosition(view); int positionById = tracker.getPositionById(id); if (position == positionById) { View from = tracker.getViewById(id); if (from != null) { // View is found, we can set up 'from' view position now getAnimator().setFromView(id, from); } } } }
@Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); int itemPosition = parent.getChildAdapterPosition(view); if (itemPosition == RecyclerView.NO_POSITION) { return; } if (mHeaderPositionCalculator.hasNewHeader(itemPosition, mOrientationProvider.isReverseLayout(parent))) { View header = getHeaderView(parent, itemPosition); setItemOffsetsForHeader(outRect, header, mOrientationProvider.getOrientation(parent)); } }
int position = parent.getChildAdapterPosition(parent.getChildAt(i)); if (position == -1) continue;
public void initHeaderBounds(Rect bounds, RecyclerView recyclerView, View header, View firstView, boolean firstHeader) { int orientation = mOrientationProvider.getOrientation(recyclerView); initDefaultHeaderOffset(bounds, recyclerView, header, firstView, orientation); if (firstHeader && isStickyHeaderBeingPushedOffscreen(recyclerView, header)) { View viewAfterNextHeader = getFirstViewUnobscuredByHeader(recyclerView, header); int firstViewUnderHeaderPosition = recyclerView.getChildAdapterPosition(viewAfterNextHeader); View secondHeader = mHeaderProvider.getHeader(recyclerView, firstViewUnderHeaderPosition); translateHeaderWithNextHeader(recyclerView, mOrientationProvider.getOrientation(recyclerView), bounds, header, viewAfterNextHeader, secondHeader); } }
@Override public void getItemOffsets(Rect outRect, View view, androidx.recyclerview.widget.RecyclerView parent, androidx.recyclerview.widget.RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); if (drawable == null) return; int position = parent.getChildAdapterPosition(view); if (position == -1) return; if (drawAfterRules != null && drawAfterRules.draw(position)) { if (getOrientation(parent) == LinearLayoutManager.VERTICAL) { outRect.bottom = height; } else { outRect.right = height; } } if (drawBeforeRules != null && drawBeforeRules.draw(position) || drawAfterRules == null && drawBeforeRules == null && position > 0) { if (getOrientation(parent) == LinearLayoutManager.VERTICAL) { outRect.top = height; } else { outRect.left = height; } } }
@Override public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(canvas, parent, state); final int childCount = parent.getChildCount(); if (childCount <= 0 || mAdapter.getItemCount() <= 0) { return; } for (int i = 0; i < childCount; i++) { View itemView = parent.getChildAt(i); int position = parent.getChildAdapterPosition(itemView); if (position == RecyclerView.NO_POSITION) { continue; } boolean hasStickyHeader = mHeaderPositionCalculator.hasStickyHeader(itemView, mOrientationProvider.getOrientation(parent), position); if (hasStickyHeader || mHeaderPositionCalculator.hasNewHeader(position, mOrientationProvider.isReverseLayout(parent))) { View header = mHeaderProvider.getHeader(parent, position); //re-use existing Rect, if any. Rect headerOffset = mHeaderRects.get(position); if (headerOffset == null) { headerOffset = new Rect(); mHeaderRects.put(position, headerOffset); } mHeaderPositionCalculator.initHeaderBounds(headerOffset, parent, header, itemView, hasStickyHeader); mRenderer.drawHeader(parent, canvas, header, headerOffset); } } }
/** * Saves current screen state: whether we are in a full image mode or not, as well as current * grid position. So that we can restore UI on configuration change. */ private void saveScreenState() { clearScreenState(); savedPhotoCount = gridAdapter.getCount(); savedPagerPosition = listAnimator.isLeaving() || pagerAdapter.getCount() == 0 ? NO_POSITION : views.pager.getCurrentItem(); if (views.grid.getChildCount() > 0) { View child = views.grid.getChildAt(0); savedGridPosition = views.grid.getChildAdapterPosition(child); savedGridPositionFromTop = child.getTop() - Views.getMarginParams(child).topMargin - views.grid.getPaddingTop(); } }
private void configureResultList() { recyclerView.setHasFixedSize(true); LinearLayoutManager recyclerLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(recyclerLayoutManager); adapter = new DiscoveryResultsAdapter(); recyclerView.setAdapter(adapter); adapter.setOnAdapterItemClickListener(view -> { final int childAdapterPosition = recyclerView.getChildAdapterPosition(view); final DiscoveryResultsAdapter.AdapterItem itemAtPosition = adapter.getItem(childAdapterPosition); onAdapterItemClick(itemAtPosition); }); }
private void configureResultList() { recyclerView.setHasFixedSize(true); recyclerView.setItemAnimator(null); LinearLayoutManager recyclerLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(recyclerLayoutManager); resultsAdapter = new ScanResultsAdapter(); recyclerView.setAdapter(resultsAdapter); resultsAdapter.setOnAdapterItemClickListener(view -> { final int childAdapterPosition = recyclerView.getChildAdapterPosition(view); final ScanResult itemAtPosition = resultsAdapter.getItemAtPosition(childAdapterPosition); onAdapterItemClick(itemAtPosition); }); }
int position = parent.getChildAdapterPosition(view); if (position == RecyclerView.NO_POSITION) {
@Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { // Skip first item in the list. if (parent.getChildAdapterPosition(view) != 0) { outRect.set(0, space, 0, 0); } } }
@Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { final int position = parent.getChildAdapterPosition(view); // get the current number of columns for the grid final int spanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount(); final int left = isFirstInRow(position, spanCount) ? 0 : mHalfSpacingOffsetPX; final int top = isInFirstRow(position, spanCount) ? 0 : mSpacingOffsetPX; final int right = isLastInRow(position, spanCount) ? 0 : mHalfSpacingOffsetPX; // the offset for the bottom should always be 0 because the top margin of the next row will apply. outRect.set(left, top, right, 0); }