安卓开发-SmartRefreshLayout实现下拉刷新功能

内容纲要

SmartRefreshLayout实现下拉加载更多、上拉刷新功能

一般结合RecyclerView使用,实现下拉刷新和显示更多

导入依赖库

Gradle添加

   implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-21'
   //没有使用特殊的Header,可以不加这行
   //implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-21'

在布局文件中添加控件

<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</com.scwang.smartrefresh.layout.SmartRefreshLayout>

在Fragment或Activity中设定监听方法

这里使用的是Fragment,在OnCreateView方法中获取控件的对象进行操作

public void initRefreshLayout(){
    //通过View找到SmartRefreshLayout对象
    RefreshLayout refreshLayout = (RefreshLayout) fragmentView.findViewById(R.id.smatrRefreshLayout);
    //设置下拉显示更多
    refreshLayout.setOnRefreshListener(new OnRefreshListener() {
        @Override
        public void onRefresh(RefreshLayout refreshlayout) {
            //上拉刷新,页数初始化为1
            page = 1;
            initData();
            refreshlayout.finishRefresh(1500/*,false*/);   //传入false表示加载失败
        }
    });
    //设置上拉刷新
    refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
        @Override
        public void onLoadMore(RefreshLayout refreshlayout) {
            //下拉加载更多,页数++
            page++;
            initData();
            refreshlayout.finishLoadMore(1500/*,false*/);    //传入false表示刷新失败
        }
    });
}

这样就能在Fragment被创建时,实现上拉加载更多,下拉刷新的效果

Adapter设定数据更新方法

设定全局变量page保存当前Recycler的页数,默认为1

  1. 当页数为1时即表示初次加载视图或者刷新视图
  2. 当页数不为1时表示进行了下拉操作,加载更多

从接口获取更多数据

更多数据指的就是历史数据,这时需要修改一下接口参数,用于获取历史数据

private void initData() {
    if(!judgeLoadStatus()){  //表示初次加载视图或者刷新视图
        //获取最新的文章(今天)
        watchDate = 0;
    }else {         //表示下拉操作,加载更多文章
        watchDate = page;//设置倒数日,watch和page都默认为0且增幅相同
    }
    //知乎日报接口地址
    url_path = "http://news-at.zhihu.com/api/4/news/latest";
    if (watchDate == 0){    //倒数日为0,即今天
        url_path ="http://news-at.zhihu.com/api/4/news/latest";
    }else{                  //返回watchDate天前的数据
        //转化日期格式,如:20191224
        url_path = "http://news.at.zhihu.com/api/4/news/before/" + NowDate.getDate(watchDate);
    }
    //创建List数组对象,用于保存网络请求的数据
    postsData = new ArrayList<>();
    //发起Http请求,获取数据
    getPostsInfo(url_path);
}

更新视图加载的数据

根据是否为下拉加载状态,选择下列更新视图的方法

  1. 初次加载视图或者当前为刷新状态,视图初始化
  2. 进行了下拉操作,数据集合变化,视图更新
private void initRecyclerView() {
    //如果不为加载状态,即为刷新状态
    if (!judgeLoadStatus()){
        //将接口数据转换为RecyclerView的列表
        recyclerView_home = fragmentView.findViewById(R.id.recyclerView_home);
        recyclerView_home.setHasFixedSize(true);
        //设置布局管理器
        layoutManager = new LinearLayoutManager(mContext);
        recyclerView_home.setLayoutManager(layoutManager);
        //设置Adapter的传入数据
        postsAdapter = new PostsAdapter(postsData);
        recyclerView_home.setAdapter(postsAdapter);
    }else{  //否则为加载状态
        postsAdapter.addData(postsData);    //添加数据
        postsAdapter.notifyDataSetChanged();    //更新数据集
    }
}

其它使用方法示例

代码示例:SmartRefreshLayout


发表评论