博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用RecyclerView 上拉加载更多
阅读量:2233 次
发布时间:2019-05-09

本文共 2841 字,大约阅读时间需要 9 分钟。

写在前面

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
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,如果已经加载完所有的数据,可以添加相应的提示。

转载地址:http://nsbbb.baihongyu.com/

你可能感兴趣的文章
(三)alin’s mysql学习笔记----常用的join连接查询
查看>>
(四)alin’s mysql学习笔记----索引简介
查看>>
分布式系统中的幂等性的理解
查看>>
spring的注解开发中的常用注解(一)------@bean @Configuration @ComponentScan @Import @Scope @Lazy
查看>>
(五)alin’s mysql学习笔记----索引性能分析
查看>>
Spring中使用@Transactional注解进行事务管理的时候只有应用到 public 方法才有效
查看>>
springboot整合rabbitmq及rabbitmq的简单入门
查看>>
mysql事务和隔离级别笔记
查看>>
事务的传播属性(有坑点)自调用失效学习笔记
查看>>
REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
查看>>
动态代理实现AOP
查看>>
23种常见的java设计模式
查看>>
关于被final修饰的基本数据类型一些注意事项
查看>>
java Thread中,run方法和start方法的区别
查看>>
在 XML 中有 5 个预定义的实体引用
查看>>
XML 元素是可扩展的
查看>>
避免 XML 属性?针对元数据的 XML 属性
查看>>
XML DOM nodeType 属性值代表的意思
查看>>
JSP相关知识
查看>>
JDBC的基本知识
查看>>