Bootstrap

Android中SmartRefreshLayout+RecyclerView实现下拉刷新和上拉加载(分页)显示网络请求数据【2、后端有分页接口的情况】

注:本文网络请求数据(包括采用OkHttp请求服务器数据,用到的实体类都可根据实际项目进行替换)。

若后端没有分页接口(数据量不大)的情况下,可参考另一篇文章: 后端无分页接口的情况.

请主要关注下拉刷新和上拉加载(分页)部分监听功能的实现,网络请求部分方法,可根据自己爱好进行替换

一、导入依赖

build.gradle(:app)

implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14'
compile 'com.alibaba:fastjson:1.1.70.android'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'

二、布局文件(主要部分)

最外层总体布局是LinearLayout

<com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/refreshView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview_alldata"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="3dp"
        android:layout_marginRight="3dp"
        android:layout_marginBottom="3dp">
    </androidx.recyclerview.widget.RecyclerView>
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>

三、activity 里面实现功能

1、定义

activity的全局变量

private SmartRefreshLayout smartRefreshLayout;
private RecyclerView recyclerView_alldata;
private AllDataAdapter allDataAdapter;//自定义适配器
private List<DeviceData> deviceDataList=new ArrayList<>();;//存放请求到的所有数据集合
private List<CardDataEntity> cl;//要展示的卡片上的适配器数据集合

String baseUrl="网络请求的url";
private Handler handler=new Handler();
private int totalPages=0;//请求设备全部数据的总页数
int pagesize=10;//显示数据每页的条数
private int current_page = 1;//当前请求数据页码
2、获取控件示例

activityde的onCreate方法里面

recyclerView_alldata=findViewById(R.id.recyclerview_alldata);
smartRefreshLayout=findViewById(R.id.refreshView);
3、实现下拉刷新、上拉加载(分页)显示数据

activity的onCreate方法里面

//卡片展示设备数据部分
recyclerView_alldata.setLayoutManager(new LinearLayoutManager(this));
//自定义网络请求所有数据的方法,初始化数据,设置适配器
cl=new ArrayList<>();
allDataAdapter=new AllDataAdapter(cl);
 recyclerView_alldata.setAdapter(allDataAdapter);
recyclerView_alldata.setItemAnimator(new DefaultItemAnimator());
initdeviceData(1);//网络请求第一页的数据

//下拉刷新和上拉加载监听
//设置下拉刷新和上拉加载样式,默认样式
 smartRefreshLayout.setRefreshHeader(new ClassicsHeader(this));
 smartRefreshLayout.setRefreshFooter(new ClassicsFooter(this));
 //下拉刷新和上拉加载更新数据
smartRefreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener() {
            /**
             * 下拉刷新
             * 重新向服务器获取第一页数据
             */
            @Override
            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
                super.onRefresh(refreshLayout);
                current_page=1;//将当前页数置为1
                initdeviceData(current_page);//请求第一页数据
                recyclerView_alldata.smoothScrollToPosition(0);//回到顶部
                smartRefreshLayout.finishRefresh(2000);
            }
            /**
             * 上拉加载,请求下一页数据
             */
            @Override
            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
                super.onLoadMore(refreshLayout);
                isreflesh=true;
                current_page++;//当前页数加1
                if (totalPages>=current_page){
                    Log.d(TAG, "上拉加载时候当前页数与总页数"+current_page+"/"+totalPages);
                    initdeviceData(current_page);
                }else {
                    toastMessage("数据已全部加载完成!");
                }
                smartRefreshLayout.finishLoadMore(2000);
            }
        });
4、3里面的网络请求方法initdeviceData(int current_page)如下
/**
 * 网络请求数据
 * @param current_page 分页函数请求参数,当前页码
 */
public void initdeviceData(int current_page){
       String newUrl="";
       //pagesize为请求每页的个数,请求url规则请根据实际项目进行撰写
       newUrl=baseUrl+"/"+current_page+"/"+pagesize;
       Log.d(TAG, "请求的接口 "+newUrl);
        //使用OkHttp进行请求
        OkHttpClient okHttpClient=new OkHttpClient();
        Request request=new Request.Builder()
                .url(newUrl)
                .build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d(TAG, "请求情况response: "+response.toString());
                dealWithResult(response.body().string(),current_page);//将请求到的内容传到主线程进行处理
            }
        });

    }

解析数据部分可参考另一篇文章
Android端使用FastJson解析从服务器请求到的JSON串数据,转为List<?>.

 /**
     * 处理网络请求数据的函数
     * @param res 网络请求到的数据
     * @param curr 当前请求页码
     */
    private void dealWithResult(final String res,int curr) {
        //在UI主线程操作
        new Handler(getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "请求到的全部数据:" + res);
                List<DeviceData> jsonList=new ArrayList<>();
                JSONObject object=JSONObject.parseObject(res);
                JSONArray jsonArray=object.getJSONArray("records");//获取请求结果中要用到的json数据
                jsonList=JSON.parseArray(jsonArray.toJSONString(),DeviceData.class);
                totalPages=object.getInteger("pages");//获取请求结果中的页数
                Log.d(TAG, "总页数: "+totalPages);
                if (totalPages!=0){
                    showDeviceName.setText(jsonList.get(0).getDeviceDescription());//显示设备名称
                }
                Log.d(TAG, "设备名称: "+showDeviceName.getText());
                //请求页码为首页时候,清空数据集合,重新赋值
                if (curr==1){
                    cl.clear();
                }
                for (int i=0;i<jsonList.size();i++){
                    DeviceData deviceData=jsonList.get(i);
                    CardDataEntity cardDataEntity=new CardDataEntity(deviceData.getDataType(),deviceData.getDataValue(),deviceData.getDeviceUnit(),deviceData.getUploadDate());
                    cl.add(cardDataEntity);
                }
                setData(cl);//更新adapter视图
            }
        });
//刷新数据和适配器视图
public void setData(List<CardDataEntity> list){
     this.cl=list;
     allDataAdapter.notifyDataSetChanged();
}

四、用到的实体类(根据实际项目进行替换)

1、接收服务器数据的Bean类DeviceData.class
/**
 * 设备数据实体类
 */
public class DeviceData {
    //设备id
    String deviceId;
    //设备描述/名称
    String deviceDescription;
    //数据类型,如溶氧含量、温度、PH等
    String dataType;
    //数据值
    String dataValue;
    //数据单位
    String deviceUnit;
    //数据上传时间
    String uploadData;

    public DeviceData() {
    }
    public DeviceData(String deviceId, String deviceDescription, String dataType, String dataValue, String deviceUnit, String uploadData) {
        this.deviceId = deviceId;
        this.deviceDescription = deviceDescription;
        this.dataType = dataType;
        this.dataValue = dataValue;
        this.deviceUnit = deviceUnit;
        this.uploadData = uploadData;
    }

    public String getDataType() {
        return dataType;
    }

    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    public String getDataValue() {
        return dataValue;
    }

    public void setDataValue(String dataValue) {
        this.dataValue = dataValue;
    }

    public String getDeviceUnit() {
        return deviceUnit;
    }

    public void setDeviceUnit(String deviceUnit) {
        this.deviceUnit = deviceUnit;
    }

    public String getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(String deviceId) {
        this.deviceId = deviceId;
    }

    public String getDeviceDescription() {
        return deviceDescription;
    }

    public void setDeviceDescription(String deviceDescription) {
        this.deviceDescription = deviceDescription;
    }

    public String getUploadData() {
        return uploadData;
    }

    public void setUploadData(String uploadData) {
        this.uploadData = uploadData;
    }


}
2、卡片展示的实体类,CardDataEntity.class
/**
 * 全部数据中展示卡片部分用到的数据类
 */
public class CardDataEntity {

    //数据类型,如溶氧含量、温度、PH等
    String dataType;
    //数据值
    String dataValue;
    //数据单位
    String deviceUnit;
    //数据上传时间
    String uploadData;

    public CardDataEntity() {
    }

    public CardDataEntity(String dataType, String dataValue, String deviceUnit, String uploadData) {
        this.dataType = dataType;
        this.dataValue = dataValue;
        this.deviceUnit = deviceUnit;
        this.uploadData = uploadData;
    }

    public String getDataType() {
        return dataType;
    }

    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    public String getDataValue() {
        return dataValue;
    }

    public void setDataValue(String dataValue) {
        this.dataValue = dataValue;
    }

    public String getDeviceUnit() {
        return deviceUnit;
    }

    public void setDeviceUnit(String deviceUnit) {
        this.deviceUnit = deviceUnit;
    }

    public String getUploadData() {
        return uploadData;
    }

    public void setUploadData(String uploadData) {
        this.uploadData = uploadData;
    }
}

五、完成,nice!

;