参考文献:
https://www.cnblogs.com/tianzhijiexian/p/4397552.html
https://www.jianshu.com/p/96f14f6a5bb4
效果图和网上很多一样,就不展示了
整体思路:
请求数据获取getData(xxxx,“refresh”),首次加载走refresh,加载更多数据getData(xxxx,“loadMore”),走loadMore,分两个线程去加载数据,在网络请求中需要判断是否为第一页。
1.封装监听加载更多
public abstract class onLoadMoreListener extends RecyclerView.OnScrollListener implements OnBottomListener {
private String TAG = getClass().getSimpleName();
public static enum LAYOUT_MANAGER_TYPE {
LINEAR,
GRID,
STAGGERED_GRID
}
/**
* layoutManager的类型(枚举)
*/
protected LAYOUT_MANAGER_TYPE layoutManagerType;
/**
* 最后一个的位置
*/
private int[] lastPositions;
/**
* 最后一个可见的item的位置
*/
private int lastVisibleItemPosition;
/**
* 当前滑动的状态
*/
private int currentScrollState = 0;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
// int lastVisibleItemPosition = -1;
if (layoutManagerType == null) {
if (layoutManager instanceof LinearLayoutManager) {
layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
} else if (layoutManager instanceof GridLayoutManager) {
layoutManagerType = LAYOUT_MANAGER_TYPE.GRID;
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
} else {
throw new RuntimeException(
"Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
}
}
switch (layoutManagerType) {
case LINEAR:
lastVisibleItemPosition = ((LinearLayoutManager) layoutManager)
.findLastVisibleItemPosition();
break;
case GRID:
lastVisibleItemPosition = ((GridLayoutManager) layoutManager)
.findLastVisibleItemPosition();
break;
case STAGGERED_GRID:
StaggeredGridLayoutManager staggeredGridLayoutManager
= (StaggeredGridLayoutManager) layoutManager;
if (lastPositions == null) {
lastPositions = new int[staggeredGridLayoutManager.getSpanCount()];
}
staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
lastVisibleItemPosition = findMax(lastPositions);
break;
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
currentScrollState = newState;
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
int visibleItemCount = layoutManager.getChildCount();
int totalItemCount = layoutManager.getItemCount();
if ((visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE &&
(lastVisibleItemPosition) >= totalItemCount - 1)) {
//Log.d(TAG, "is loading more");
onBottom();
}
}
@Override
public void onBottom() {
//Log.d(TAG, "is onBottom");
}
private int findMax(int[] lastPositions) {
int max = lastPositions[0];
for (int value : lastPositions) {
if (value > max) {
max = value;
}
}
return max;
}
}
2.下拉刷新
//设置下拉时圆圈的颜色(可以由多种颜色拼成)
refreshLayout.setColorSchemeResources(R.color.orange,
R.color.red,
R.color.blue);
//设置下拉时圆圈的背景颜色(这里设置成白色)
refreshLayout.setProgressBackgroundColorSchemeResource(android.R.color.white);
//设置下拉刷新时的操作
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//具体操作, 加载数据
}
});
3.页面判断
//滑动后禁止重复加载
(recycleview).addOnScrollListener(new onLoadMoreListener() {
@Override
public void onBottom() {
super.onBottom();
// 到底部自动加载
if (!isLoadingData){
page+=1 //每次请求页数加一
//网络请求,加载数据,page页数和limit数量显示需要设定好,建议使用线程加载数据
isLoadingData = true; //锁定,防止多次重复请求
}
}
});
//在加载数据时判断
if (“refresh”.equals(type)) {
list需要清空
}else{
list数据加入
isLoadingData = false; //加载完需要开放滑动继续请求
}
//取消刷新
if (refreshLayout.isRefreshing()) {
refreshLayout.setRefreshing(false);
}
4.适配器
private final static int TYPE_CONTENT=0;//正常内容
private final static int TYPE_FOOTER=1;//加载View
@Override
public int getItemViewType(int position) {
if (position==orderInfoBeanList.size()){
return TYPE_FOOTER;
}
return TYPE_CONTENT;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == TYPE_FOOTER) {
加载布局
return new FootViewHolder(view);
} else {
正常显示的布局
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
}
//渲染布局并进行监控
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if (getItemViewType(position)==TYPE_FOOTER){
}
else {
ViewHolder viewHolder = (ViewHolder) holder;
…
}
//自定义
@Override
public int getItemCount() {
if ( list.size()==1){
return list.size();
}else {
return list == null ? 0 : list.size()+1;//加载显示多一个
}
}
private class FootViewHolder extends RecyclerView.ViewHolder{
ContentLoadingProgressBar contentLoadingProgressBar;
public FootViewHolder(View itemView) {
super(itemView);
contentLoadingProgressBar=itemView.findViewById(R.id.pb_progress);
}
}
private class ViewHolder extends RecyclerView.ViewHolder{
// xxxx声明
public FootViewHolder(View itemView) {
super(itemView);
//绑定布局
}
}
5.布局文件
加载布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/pb_progress"
style="?android:attr/progressBarStyle"
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center_horizontal”
android:indeterminateDrawable="@drawable/progressbar"/>
drawable自定义进度条
<?xml version="1.0" encoding="utf-8"?>
<!--type扫描线渐变-->
<!--三种颜色的渐变-->
<gradient
android:centerColor="#FFFFFF"
android:centerY="0.50"
android:endColor="@color/blue"
android:startColor="#22222222"
android:type="sweep"
android:useLevel="false" />
</shape>