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



    
    
    

三、activity 里面实现功能

1、定义

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();
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 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!

你可能感兴趣的:(Android,安卓控件,网络请求,android,网络)