下面列出了android.support.v7.widget.LinearLayoutManager#findLastCompletelyVisibleItemPosition ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public boolean isLastItemVisible() {
if (mRootView != null) {
final RecyclerView.Adapter adapter = mRootView.getAdapter();
LinearLayoutManager layoutManager = (LinearLayoutManager) mRootView.getLayoutManager();
if (adapter == null || adapter.getItemCount() == 0) {
LogUtil.d(TAG, "空数据");
return true;
} else {
if (layoutManager != null) {
int lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
if (lastPosition == adapter.getItemCount() - 1 && lastPosition > 5) {
return true;
} else {
return false;
}
}
return false;
}
}
return false;
}
private View getStartView(RecyclerView.LayoutManager layoutManager,
OrientationHelper helper) {
if (!(layoutManager instanceof LinearLayoutManager)) {
return super.findSnapView(layoutManager);
}
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
int firstChild = linearLayoutManager.findFirstVisibleItemPosition();
boolean isLastItem = linearLayoutManager.findLastCompletelyVisibleItemPosition() == layoutManager.getItemCount() - 1;
if (firstChild == RecyclerView.NO_POSITION || isLastItem) {
return null;
}
View child = layoutManager.findViewByPosition(firstChild);
if (helper.getDecoratedEnd(child) >= helper.getDecoratedMeasurement(child) / 2
&& helper.getDecoratedEnd(child) > 0) {
return child;
} else {
return layoutManager.findViewByPosition(firstChild + 1);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
itemCount = layoutManager.getItemCount();
lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
} else {
Log.e("OnLoadMoreListener", "The OnLoadMoreListener only support LinearLayoutManager");
return;
}
if (lastItemCount != itemCount && (lastPosition > itemCount - 3)) {
lastItemCount = itemCount;
this.onLoadMore();
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
LoadMoreRecyclerView view = (LoadMoreRecyclerView) recyclerView;
onLoadMoreListener onLoadMoreListener = view.getOnLoadMoreListener();
onLoadMoreListener.onScrolled(recyclerView, dx, dy);
//if scroll to bottom
LinearLayoutManager layoutManager = (LinearLayoutManager) view.getLayoutManager();
int lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition();
int itemCount = layoutManager.getItemCount();
if (lastVisibleItem >= itemCount - 1 && !view.getLoadingMore()) {
onLoadMoreListener.onLoadMore();
L.i(TAG, "load more: lastVisibleItem = " + lastVisibleItem + ", itemCount " + itemCount);
} else {
super.onScrolled(recyclerView, dx, dy);
}
}
private RecyclerView.OnScrollListener getScrollToBottomListener(final LinearLayoutManager linearLayoutManager) {
return new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
int lastItem = linearLayoutManager.findLastCompletelyVisibleItemPosition();
int count = mPostListAdapter.getItemCount() - 1;
boolean isBottom = (lastItem == count);
if (!mSwipeRefreshLayout.isRefreshing() && isBottom) {
if (!mIsFirstTimeTouchBottom) {
Log.e("onScrolled=>", "refresh.... ");
mPresenter.loadNextPage();
} else {
mIsFirstTimeTouchBottom = false;
}
}
}
};
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
itemCount = layoutManager.getItemCount();
lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
} else {
Log.e("OnLoadMoreListener", "The OnLoadMoreListener only support LinearLayoutManager");
return;
}
if (lastItemCount != itemCount && lastPosition == itemCount - 1) {
lastItemCount = itemCount;
this.onLoadMore();
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (dy < 0 || loadMoreSubject == null || loadMoreSubject.isLoading()){
return;
}
int lastItem = 0;
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
int totalItemCount = layoutManager.getItemCount();
if (layoutManager instanceof GridLayoutManager) {
GridLayoutManager gridLayoutManager = ((GridLayoutManager) layoutManager);
//Position to find the final item of the current LayoutManager
lastItem = gridLayoutManager.findLastCompletelyVisibleItemPosition();
if (lastItem == -1){
lastItem = gridLayoutManager.findLastVisibleItemPosition();
}
} else if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = ((LinearLayoutManager) layoutManager);
lastItem = linearLayoutManager.findLastCompletelyVisibleItemPosition();
if (lastItem == -1){
lastItem = linearLayoutManager.findLastVisibleItemPosition();
}
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager staggeredGridLayoutManager = ((StaggeredGridLayoutManager) layoutManager);
// since may lead to the final item has more than one StaggeredGridLayoutManager the particularity of the so here that is an array
// this array into an array of position and then take the maximum value that is the last show the position value
int[] lastPositions = staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(null);
lastItem = findMax(lastPositions);
}
final int childCount = layoutManager.getChildCount();
final boolean shouldLoadMore = (childCount > 0 && lastItem >= totalItemCount - VISIBLE_THRESHOLD);
if (shouldLoadMore) {
loadMoreSubject.onLoadMore();
}
}
/**
* 获取最后一个可见/完全可见item的位置索引
* @param layoutManager RecyclerView.LayoutManager对象
* @param isCompletelyVisible 是否完全可见
* @return item的索引
*/
public static int getLastVisibleItemPosition(@NonNull RecyclerView.LayoutManager layoutManager, boolean isCompletelyVisible) {
int lastVisibleItemPosition = -1;
if (layoutManager instanceof LinearLayoutManager) {//GridLayoutManager继承LinearLayoutManager
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
lastVisibleItemPosition = isCompletelyVisible ? linearLayoutManager.findLastCompletelyVisibleItemPosition() : linearLayoutManager.findLastVisibleItemPosition();
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
int[] lastVisibleItemPositions = isCompletelyVisible ? staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(null) : staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(null);
if (lastVisibleItemPositions != null && lastVisibleItemPositions.length > 0)
lastVisibleItemPosition = findMax(lastVisibleItemPositions);
}
return lastVisibleItemPosition;
}
@Override
public void onScrollStateChanged(int state) {
/* LinearLayoutManager mLayoutManager = (LinearLayoutManager) getLayoutManager();
int lastVisibleItemPosition = 0;
int totalItemCount = 0;
if (mLayoutManager instanceof LinearLayoutManager) {
if (state == RecyclerView.SCROLL_STATE_IDLE) {
lastVisibleItemPosition = mLayoutManager.findLastCompletelyVisibleItemPosition();
totalItemCount = mLayoutManager.getItemCount();
if (lastVisibleItemPosition == (totalItemCount - 1) && isScrollingToBottom) {
if (listener != null)
listener.loadMore();
}
}
} else if (mLayoutManager instanceof GridLayoutManager) {
if (state == RecyclerView.SCROLL_STATE_IDLE) {
lastVisibleItemPosition = mLayoutManager.findLastCompletelyVisibleItemPosition();
totalItemCount = mLayoutManager.getItemCount();
if (lastVisibleItemPosition == (totalItemCount - 1) && isScrollingToBottom) {
if (listener != null)
listener.loadMore();
}
}
}
*/
LinearLayoutManager layoutManager = (LinearLayoutManager) getLayoutManager();
if (state == RecyclerView.SCROLL_STATE_IDLE) {
int lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition();
int totalItemCount = layoutManager.getItemCount();
if (lastVisibleItem == (totalItemCount - 1) && isScrollingToBottom) {
if (listener != null)
listener.loadMore();
}
}
}
private boolean hasHitBottom() {
if (mMainView instanceof ScrollView) {
ScrollView scrollView = (ScrollView) mMainView;
View view = scrollView.getChildAt(scrollView.getChildCount() - 1);
int diff = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY()));// Calculate the scrolldiff
return diff == 0;
} else if (mMainView instanceof ListView) {
ListView listView = (ListView) mMainView;
if (listView.getAdapter() != null) {
if (listView.getAdapter().getCount() > 0) {
return listView.getLastVisiblePosition() == listView.getAdapter().getCount() - 1 &&
listView.getChildAt(listView.getChildCount() - 1).getBottom() <= listView.getHeight();
}
}
} else if (mMainView instanceof RecyclerView) {
RecyclerView recyclerView = (RecyclerView) mMainView;
if (recyclerView.getAdapter() != null && recyclerView.getLayoutManager() != null) {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter.getItemCount() > 0) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
return linearLayoutManager.findLastCompletelyVisibleItemPosition() == adapter.getItemCount() - 1;
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
int[] checks = staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(null);
for (int check : checks) {
if (check == adapter.getItemCount() - 1)
return true;
}
}
}
}
}
return false;
}
private boolean isAtEdgeOfList(LinearLayoutManager lm) {
if ((!lm.getReverseLayout() && gravity == Gravity.START)
|| (lm.getReverseLayout() && gravity == Gravity.END)
|| (!lm.getReverseLayout() && gravity == Gravity.TOP)
|| (lm.getReverseLayout() && gravity == Gravity.BOTTOM)) {
return lm.findLastCompletelyVisibleItemPosition() == lm.getItemCount() - 1;
} else if (gravity == Gravity.CENTER) {
return lm.findFirstCompletelyVisibleItemPosition() == 0
|| lm.findLastCompletelyVisibleItemPosition() == lm.getItemCount() - 1;
} else {
return lm.findFirstCompletelyVisibleItemPosition() == 0;
}
}
@Override
public void onScrollStateChanged(int state) {
LinearLayoutManager layoutManager = (LinearLayoutManager) getLayoutManager();
if (state == RecyclerView.SCROLL_STATE_IDLE) {
int lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition();
int totalItemCount = layoutManager.getItemCount();
if (lastVisibleItem == (totalItemCount - 1) && isScrollingToBottom) {
if (listener != null)
listener.loadMore();
}
}
}
private void toggleExpanded() {
if (busyIndicator.getVisibility() == View.VISIBLE) {
// Don't allow collapsing the view when the busy indicator
// is shown because the APK is being downloaded and it's quite important
return;
}
boolean expand = !versionsExpandTracker.get(apk.apkName);
expand(expand);
if (expand) {
// Scroll the versions view to a correct position so it can show the whole item
final LinearLayoutManager lm = (LinearLayoutManager) recyclerView.getLayoutManager();
final int currentPosition = getAdapterPosition();
if (currentPosition >= lm.findLastCompletelyVisibleItemPosition()) {
// Do it only if the item is near the bottom of current viewport
recyclerView.getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Expanded item dimensions should be already calculated at this moment
// so it's possible to correctly scroll to a given position
recyclerView.smoothScrollToPosition(currentPosition);
recyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
}
}
}
private boolean isLastMessageVisible() {
LinearLayoutManager layoutManager = (LinearLayoutManager) messageListView.getLayoutManager();
int lastVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition();
return lastVisiblePosition >= adapter.getBottomDataPosition();
}
private boolean isLastMessageVisible() {
LinearLayoutManager layoutManager = (LinearLayoutManager) messageListView.getLayoutManager();
int lastVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition();
return lastVisiblePosition >= adapter.getBottomDataPosition();
}