使用RecyclerView 上拉加载更多

写在前面

ListView 与ReyclerView 已经是目前主流APP中最常用的几个控件,但是RecyclerView 提供了更好的解耦方式来复用ViewHolder,并且可以更方便地实现瀑布流,GridView等样式,对于开发者而言更加友好。

目前大部分的App在使用RecyclerView的时候会采用上拉加载更多,下拉刷新的功能。对于下拉刷新,处理方式就比较简单,我们可以把RecyclerView放到一个由官方提供的刷新控件SwipeRefreshLayout中,同时监听滑动状态,在相应的回调中进行刷新的方法即可。但是对于上拉加载更多就有些麻烦了。

我们很清楚,网络请求中分页的重要性,一方面,降低了服务器查询数据的压力,另一方面,避免一次性请求过多数据造成时间的过度等待。

接下来,我们就来实现一个简单的上拉加载更多的功能。

在我开发过程中,主要通过三种方式进行功能的实现:

1、通过第三方控件,类似于SmartRefreshLayout,我们在该布局中添加RecyclerView,然后添加相对应的回调。好处是节约了造轮子的时间,并且可以实现多样化的刷新功能。当然也有不好的地方,毕竟一个第三方库大部分的功能都是我们不需要的,在开发过程中过度依赖第三方,只会造成APP的“虚胖”

2、我们手动造轮子,这是一种比较简单但是实用的实现方式,我们先通过自定义View 实现一个当RecyclerView滑到底部时候的加载动画footview,然后重写一个RecyclerView,对其滑动进行监听,如果滑到最底部,则显示出该footview,数据加载之后则移除该footview。该方法的好处是减小了应用的体积,处理方法与显示方式可以更加灵活,但是这意味着我们需要花更多的时间在编写代码上面。

3、今天的主题,通过监听RecyclerView的方式,来进行数据的添加,但是这里省去了FootView 的编写,即没有加载动画,加载成功后就直接添加数据,好处是方便,当然,我们也要为方便付出一些代价,如果数据请求的时间比较长,当滑到底部时,用户无法判断出是否已经获取完全部数据。


今天我们就先尝试着这种简单的加载更多数据的方式。

下拉刷新我就不过多阐述了,直接把RecyclerView 放到SwipeRefreshLayout中就行了。

我们先写一个放置了RecyclerView的Activity,Item和Adapter我就不在博文里写了,到时候会把源码贴出来。

public class MainActivity extends AppCompatActivity {

    RecyclerView rv_content;
    private List<String> list_content  = new ArrayList<>();
    private MyAdapter adapter ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rv_content = (RecyclerView)findViewById(R.id.rv_content);


       adapter = new MyAdapter(this,list_content);
        rv_content.setLayoutManager(new LinearLayoutManager(this));
        rv_content.setAdapter(adapter);
        rv_content.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int lastItem = ((LinearLayoutManager) rv_content.getLayoutManager()).findLastVisibleItemPosition();
                int totalItemCount = rv_content.getLayoutManager().getItemCount();
                if (lastItem >= totalItemCount - 2 && dy > 0) {
                    if (list_content.size()<36){
                        String content = "添加的数据";
                        list_content.add(content);
                        adapter.notifyDataSetChanged();
                    }else {
                        Toast.makeText(getApplicationContext(), "没有更多数据", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });

        addData();
        adapter.notifyDataSetChanged();
    }
    private void addData(){
        for (int i = 0;i<30;i++){
            String content = "第"+i+"条数据";
            list_content.add(content);
        }
    }

}


对recyclerview 进行监听,如果已加载的集合长度中不可视的Item为两个的时候,就开始请求数据(我在demo中是直接添加数据,在工作环境中这里可以添加网络请求方法,然后在回调函数中判断时候加载完毕),添加完毕后刷新RecyclerView,如果已经加载完所有的数据,可以添加相应的提示。

Demo下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值