狼人小林的博客

下拉刷新

Android 一种简单和优雅的方式实现下拉刷新和加载更多

老生常谈的问题,但是发现很多人仍然将其视为难题。

很多实现也很复杂,有人甚至做了一个 SuperRefreshLayout 或者 SuperListView 或者 SuperRecyclerView 来实现。

其实不需要 Super,使用很少的简介的代码也可以实现。

最近做了个总结,尝试给出最佳实践。上面是效果图,支持 ListView 和 RecyclerView。

相关代码在这里:https://github.com/TakWolf/Android-RefreshAndLoadMore-Demo

这个方案来源于我自己的开发实践,个人认为已接近最佳实践,简单且优雅。

要注意的是,这篇文章介绍的是如何用现有资源快速实现一个下拉刷新和加载更多分页效果,

而不是如何去实现或者自定义一个下拉刷新控件。那是另外一个话题,咱们改天再聊。

准备工作

我们的原则是,尽可能使用现成的资源去实现。

即便如此,我们仍然使用了下面的第三方依赖,但是注意,这些依赖都不是必须的:

1.Material-ish Progress

一个可以兼容低版本的 Material Design 风格进度条样式。我希望可以保证所有版本的 Android 都要良好的 Material Design 体验。

这不是必须的,你可以替换为默认的进度条控件或者你自己的控件,除了样式之外,不会有其他问题。

2.Android-HeaderAndFooterRecyclerView

这是我写的另外一个组件,它可以扩充 RecyclerView,让其支持 HeaderView 和 FooterView。我们在实现加载更多的时候需要这个特性。

这个组件使用非常简单,替换默认的 RecyclerView 就可以了。接口与 ListView 添加头部的方式类似。不需要修改其他任何东西(例如你的业务Adapter)。

仅此而已,非侵入式,没有额外的东西。

这不是必须的,你可以有你自己的方式实现这个功能。这不影响我们整篇文章的思路。但是我很推荐你去试试它,也许你会觉得不错呢。

3.Butter Knife

通过注解的方式快速实现控件绑定。

这不是必须的,你可以使用 findViewById(),效果是一样的。不过我推荐你去看看,真的很方便。

基本思路

下拉刷新比较容易实现,因为 Android 官方的 support 组件中就实现了一个下拉刷新组件:SwipeRefreshLayout

支持 ListView 和 RecyclerView,符合 Material Design,使用简单,性能良好。

港真,除非你遇到一个变态的产品经理,否则有啥理由不使用这个呢?

下拉刷新的实现,大家的方式分歧比较大,很多人尝试在父布局上面下功夫。

我个人觉得最简单的实现是在列表的最后添加一个 FooterView,用它来显示加载动画。同时监听列表滚动,检测滑动到底部的时候,触发加载动作。

这样的好处是,不在需要复杂的去实现一个自定义控件(包括去实现那些复杂的手势处理),也没有一些特殊情况下的问题(比如首页加载不足一屏,我们下面会讲)。