版权声明:转载时请标明出处。https://blog.csdn.net/mhhyoucom https://blog.csdn.net/mhhyoucom/article/details/81130423
recyclerview 判断滑动到底部是一种非常常见操作,这里我封装一个类非常方便可以实现底部判断操作。
public class CXLoadMoreListener extends RecyclerView.OnScrollListener {
private int lastVisibleItem;
private RecyclerView.Adapter<RecyclerView.ViewHolder> testMovieAdapter;
private Runnable runnable;
private LinearLayoutManager linearLayoutManager;
public CXLoadMoreListener(RecyclerView.Adapter<RecyclerView.ViewHolder> testMovieAdapter, LinearLayoutManager linearLayoutManager, Runnable runnable) {
this.testMovieAdapter = testMovieAdapter;
this.runnable = runnable;
this.linearLayoutManager = linearLayoutManager;
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == testMovieAdapter.getItemCount()) {
if (!isSlideToBottom(recyclerView))//精确判断是否底部
return;
if (runnable!=null)
{
runnable.run();
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem=linearLayoutManager.findLastVisibleItemPosition();
}
public boolean isSlideToBottom(RecyclerView recyclerView) {
if (recyclerView == null) return false;
if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset()
>= recyclerView.computeVerticalScrollRange())
return true;
return false;
}
}
下面这个代码是精确判断到底部,如果只需要判断最后一项item 显示可以去掉这个判断。
if (!isSlideToBottom(recyclerView))//精确判断是否底部
return;
使用方法:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.addOnScrollListener(new CXLoadMoreListener(adapter, linearLayoutManager, new Runnable() {
@Override
public void run() {//底部执行方法
adapter.changeMoreStatus(CXLoadMoreAdapterHelper.LOAD_MORE);
adapter.notifyItemChanged(adapter.getItemCount()-1);
CXUtils.runOnUI(CXConfig.refresh_header_min_time, new Runnable() {
@Override
public void run() {
if (currentIndex>pageSize)
{
adapter.changeMoreStatus(CXLoadMoreAdapterHelper.NO_MORE);
adapter.notifyItemChanged(adapter.getItemCount()-1);
}else {
requestPLData(false);
}
}
});
}
}));