通过recycleview进行上拉加载和下拉刷新,okhttp网络请求数据加载分页

参考文献:
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>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值