注:本文网络请求数据(包括采用HttpURLConnection请求服务器数据,用到的实体类都可根据实际项目进行替换)。
还有就是本文是在前端请求到全部数据后进行分页,这种方法适用于请求数据量不大的情况,如果请求的全部数据量过多的话,页面反应会很慢,用户体验会很差。
所以,如果请求数据量很大且后端已经提供分页函数的时候,请参考另一篇文章:
请主要关注下拉刷新和上拉加载(分页)部分监听功能的实现,网络请求部分方法,可根据自己爱好进行替换
build.gradle(:app)
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14'
compile 'com.alibaba:fastjson:1.1.70.android'
最外层总体布局是LinearLayout
activity的全局变量
private SmartRefreshLayout smartRefreshLayout;
private RecyclerView recyclerView_alldata;
private AllDataAdapter allDataAdapter;//自定义适配器
private List deviceDataList;//存放请求到的所有数据集合
private List cl;//要展示的卡片上的适配器数据集合
//网络请求
String url="网络请求的url";
private Handler handler=new Handler();
activityde的onCreate方法里面
recyclerView_alldata=findViewById(R.id.recyclerview_alldata);
smartRefreshLayout=findViewById(R.id.refreshView);
activity的onCreate方法里面
//卡片展示设备数据部分
recyclerView_alldata.setLayoutManager(new LinearLayoutManager(this));
//自定义网络请求所有数据的方法,初始化数据,设置适配器
initdeviceData();
//下拉刷新和上拉加载监听
//设置下拉刷新和上拉加载样式,默认样式
smartRefreshLayout.setRefreshHeader(new ClassicsHeader(this));
smartRefreshLayout.setRefreshFooter(new ClassicsFooter(this));
//下拉刷新和上拉加载更新数据
smartRefreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener(){
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
super.onRefresh(refreshLayout);
initdeviceData();
smartRefreshLayout.finishRefresh(2000);
}
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
super.onLoadMore(refreshLayout);
smartRefreshLayout.finishLoadMore(2000);
//获取试图总条目
int count = allDataAdapter.getItemCount();
//如果当前试图总条目==集合长度
if (count == deviceDataList.size()) {
Toast.makeText(AllDataActivity.this, "数据已全部加载完成", Toast.LENGTH_SHORT).show();
}
//当前试图总条目+10就是 一次加载10条目,可自行调整
if (count + 10 < deviceDataList.size()) {
for (int i = count; i < (count + 10); i++) {
DeviceData d=deviceDataList.get(i);
CardDataEntity cardDataEntity=new CardDataEntity(d.getDataType(),d.getDataValue(),d.getDeviceUnit(),d.getUploadData());
cl.add(cardDataEntity);
}
allDataAdapter.notifyDataSetChanged();
} else {
for (int i = count; i < deviceDataList.size(); i++) {
DeviceData d=deviceDataList.get(i);
CardDataEntity cardDataEntity=new CardDataEntity(d.getDataType(),d.getDataValue(),d.getDeviceUnit(),d.getUploadData());
cl.add(cardDataEntity);
}
}
}
});
//首次进入页面自动刷新
mRefreshLayout.autoRefresh();
注:网络请求数据部分可根据自己实际项目进行替换,本文用的是HttpURLConnection
/**
* 请求服务器数据方法
*/
private void initdeviceData(){
new Thread(){
@Override
public void run() {
try {
URL httpurl=new URL(url);
//与服务器建立连接
HttpURLConnection connection= (HttpURLConnection) httpurl.openConnection();
connection.setReadTimeout(5000);
connection.setRequestMethod("GET");
//将获取的数据放到StringBuffer里面
final StringBuffer sb=new StringBuffer();
BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
String line;
//将数据添加进StringBuffer中
while ((line=reader.readLine())!=null){
sb.append(line);
}
//使用Handler更新UI;当然这里也可以使用sendMessage();handMessage()来进行操作;
handler.post(new Runnable() {
@Override
public void run() {
//处理数据函数
dealWithResult(sb.toString());
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
解析数据部分可参考另一篇文章
Android端使用FastJson解析从服务器请求到的JSON串数据,转为List<?>.
/**
* 处理网络请求数据的函数
*/
private void dealWithResult(final String res){
//在UI主线程操作,最开始请求前10条数据
new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {
Log.e("deal", "deal:"+res );
//deviceDataList里面是请求到的全部数据
deviceDataList= JSONArray.parseArray(res,DeviceData.class);
//首次先显示前10条数据(可自行调整)
cl=new ArrayList<>();
for (int i=0;i<10;i++){
DeviceData d=deviceDataList.get(i);
CardDataEntity cardDataEntity=new CardDataEntity(d.getDataType(),d.getDataValue(),d.getDeviceUnit(),d.getUploadData());
cl.add(cardDataEntity);
}
refleshAdapter(cl);//每次请求服务器数据,重新建立adapter,添加数据
}
});
}
/**
* 自定义给recyclerview建立适配器的方法
* 包括对单项item的监听
*/
private void refleshAdapter(List cl){
allDataAdapter=new AllDataAdapter(cl);
recyclerView_alldata.setAdapter(allDataAdapter);
/*3、添加item的添加和移除动画, 这里我们使用系统默认的动画*/
recyclerView_alldata.setItemAnimator(new DefaultItemAnimator());
/*设置条目点击事件*/
allDataAdapter.setOnItemClickListener(new AllDataAdapter.OnItemClickListener() {
@Override
public void OnItemClick(View v, int position) {
Toast.makeText(AllDataActivity.this, cl.get(position).getDataType(), Toast.LENGTH_SHORT).show();
}
});
}
/**
* 设备数据实体类
*/
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;
}
}
/**
* 全部数据中展示卡片部分用到的数据类
*/
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;
}
}