goole官方下拉刷新 SwipeRefreshLayout

现在基本每一款App都要必备下拉刷新功能,而且很多人都养成了手指下滑刷新这一动作了,android也有很多第三方的下拉刷新框架。使用第三方的是很方便但是有很多时候都会出现Jar包冲突,Google推出了一款自己的刷新控件就是SwipeRefreshLayout,也很好用,但是它只有下拉刷新的功能,没有加载更多,需要自己实现加载更多方法,网上同样有很多方法,我自己也写了一个方法,自认为很简单,和大家分享一下。先说一下实现思路吧:一般下拉刷新都是列表,有列表就会和listview,recycleview 等等,我们可以监听列表状态,当滚动到达列表最后一条时,我们就可以联网请求下一页数据了
伪代码如下:

此文省略第一次正常联网,下面是加载更多时的二次联网的相关代码

listview监听滚动到最后一条

 listview.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                if (view.getLastVisiblePosition() == view.getCount() - 1) {
                    //加载更多功能的代码
                    pageNum++;
                    if (nextPageNo ) {//是否还有下一页


                        loadMore(pageNum + "");
//                     
                    } else {
                        Toast.makeText(TaxSportsActivity.this, "没有更多了", Toast.LENGTH_SHORT).show();
                    }

                }


            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });

//联网并解析数据

private void loadMore(String pageNum) {


        User user = new User();
        user.setToken(VIPApplication.getDeviceId());
        user.setPageNum(pageNum);
        OkHttpUtils
                .postString()
                .url(Constant.SportsUrl)
                .content(new Gson().toJson(user))
                .mediaType(MediaType.parse("application/json; charset=utf-8"))
                .build()
                .execute(new StringCallback() {


                    @Override
                    public void onError(Call call, Exception e) {

                    }

                    @Override
                    public void onResponse(String response) {

                        processData2(response);

                    }
                });
    }

private void processData2(String response) {

    Gson gson = new Gson();

    SportsListModel sportsListModel = gson.fromJson(response, SportsListModel.class);

    sysNews1 = sportsListModel.getSysNews();
    boolean nextPageNo2 = sportsListModel.isNextPageNo();
    nextPageNo = nextPageNo2;
     //这几行代码是核心
    **if (adapter == null) {
        adapter = new adapter(this, list1);
        listview.setAdapter(adapter);
    } else {
        adapter.addData(adapter.getDataCount(), list1);
        adapter.notifyDataSetChanged();
    }
}**

//下面是adapter里的代码,同样很重要


adapter中其他方法省略掉,因为那都是必有的,我不写相信大家也知道要有,下面三个方法很重要
第一个方法是刷新时就会用到的
第二个方法是在加载更多时,在原有的集合里把新请求到的集合加进去
第三个方法是获得总的数量,保证每次加载的新数据都是在原有集合基础上加进去的,否则就会出现,只有加载更多时请求到的数据,以前的数据没有了,显然不是我们想看到的

/**
* 添加集合方法,刷新时要用到
*/

public void setData(List<>item){
this.data=item;
}

  /**
 * 添加数据
 *
 * @param position
 * @param item
 */
public void addData(int position, List<>item) {
    if (item != null && item.size() > 0) {
        datas.addAll(position, item);
        notifyDataSetChanged();

    }

}
/**
 * 得到数据的总条数
 *
 * @return
 */
public int getDataCount() {
    return datas.size();
}

}

下面贴上刷新时的代码

//找到刷新控件
refresh = (SwipeRefreshLayout) findViewById(R.id.sports_refresh);

  //设置刷新时转圈的颜色  sports_refresh.setColorSchemeResources(R.color.colorAccent);
   //刷新监听
    sports_refresh.setOnRefreshListener(this);

public void onRefresh() {
if (list!= 0) {
list.clear();//一定要在重新联网请求时先clear
pageNum=1;
initData();
}
onRefreshComplete();

}

private void onRefreshComplete() {
    sports_refresh.setRefreshing(false);
          Toast.makeText(this, "刷新完成", Toast.LENGTH_SHORT).show();
}

“`

哎,代码贴的好乱呀,希望各位看客能看懂。其实我想看了文字应该就已经明白差不多了,最重要的就是adapter里面的三个方法!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值