Android中SmartRefreshLayout+RecyclerView实现下拉刷新和上拉加载(分页)显示网络请求数据【1,后端无分页接口的情况】
·
注:本文网络请求数据(包括采用HttpURLConnection请求服务器数据,用到的实体类都可根据实际项目进行替换)。
还有就是本文是在前端请求到全部数据后进行分页,这种方法适用于请求数据量不大的情况,如果请求的全部数据量过多的话,页面反应会很慢,用户体验会很差。
所以,如果请求数据量很大且后端已经提供分页函数的时候,请参考另一篇文章:
请主要关注下拉刷新和上拉加载(分页)部分监听功能的实现,网络请求部分方法,可根据自己爱好进行替换
一、导入依赖
build.gradle(:app)
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14'
compile 'com.alibaba:fastjson:1.1.70.android'
二、布局文件(主要部分)
最外层总体布局是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;//存放请求到的所有数据集合
private List<CardDataEntity> cl;//要展示的卡片上的适配器数据集合
//网络请求
String url="网络请求的url";
private Handler handler=new Handler();
2、获取控件示例
activityde的onCreate方法里面
recyclerView_alldata=findViewById(R.id.recyclerview_alldata);
smartRefreshLayout=findViewById(R.id.refreshView);
3、实现下拉刷新、上拉加载(分页)显示数据
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();
4、3里面的initdeviceData()如下
注:网络请求数据部分可根据自己实际项目进行替换,本文用的是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<CardDataEntity> 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();
}
});
}
四、用到的实体类(根据实际项目进行替换)
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!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)