注:本文网络请求数据(包括采用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;
}
}