PulmListView:上拉加载更多的ListView
就在昨天,《第二行代码》终于通过了国家的备案,并且取得了ISBN号,也就是所谓的书号,这样就只差最后一步向新闻出版广电总局申报CIP,然后就可以送去厂里印刷了。至于这个CIP是干什么用的我也搞不明白,反正就是国家规定一定要申报,所以也只能按照规定的流程来走。不过CIP只是书后的一个影子,是不会体现在书上的,只有ISBN才会体现在书上。因此,《第二行代码》最终的封面昨天也就确定下来了。当然,封面的主题就是大家之前投票选出来的,想看完整封面的朋友请在公众号主页回复 “封面” 即可。
作者简介
明天就是周六了,这里提前祝大家周末愉快。本篇来自 小一 的投稿,与大家分享了他实现一个上拉加载的ListView的过程。希望文中的思路能对大家有所启发。
小一 的博客地址:
http://blog.****.net/wzy_1988
思路
今天带大家实现一个上拉加载更多的 ListView,GitHub传送门:
https://github.com/wangzhengyi/PulmListView
欢迎大家 fork&&star。
先带大家看一下示例效果:
然后带大家理一下实现思路, 如果我们要实现一个上拉加载更多的 ListView, 我们需要实现的功能包括:
一个自定义的 ListView, 并且该 ListView 能够判断当前是否已经处于最底部.
一个自定义的 FooterView, 用于在 ListView 加载更多的过程中进行UI展示.
关联 FooterView 和 ListView , 包括加载时机判断、FooterView的显示和隐藏.
提供一个加载更多的接口, 便于回调用户真正加载更多的功能实现.
提供一个加载更多结束的回调方法, 用于添加用户的最新数据并更新相关状态标记和UI显示.
针对上面的5个功能, 我们挨个分析对应的实现方法.
自定义ListView
我们可以通过 继承ListView, 实现一个自定义的 PulmListView.
只是实现 ListView 的三个构造函数还不够, 我们需要 ListView 能够判断当前的 ListView 是否滑动到最后一个元素.
判断是否滑动到最后一个元素, 我们可以通过为 ListView 设置 OnScrollListener 来实现.代码如下:
从代码注释可以知道, 通过 (firstVisibleItem + visibleItemCount) 可以获取当前屏幕已经展示的元素个数, 如果已经展示的元素个数等于 ListView 的元素总数, 则此时可以认为 ListView 已经滑动到底部.
自定义FooterView
这里我们可以实现一个比较简单的 FooterView, 即加载更多的UI布局.例如我们可以展示 一个ProgressBar 和 一行文字, 具体代码如下:
布局文件:
关联ListView和FooterView
第一,我们需要在 ListView 中通过一个变量保存 FooterView, 并且在构造函数中将其实例化.
private View mLoadMoreView;private void init() {
mLoadMoreView = new LoadMoreView(getContext());
}
第二,我们需要控制 FooterView 的显示和隐藏.考虑一下 FooterView 的显示和隐藏的时机:
显示的时机: ListView 处于最底部并且当前还有更多的数据需要加载.
隐藏的时机: ListView 结束完加载更多的操作.
为了判断当前是否还有数据需要加载, 因此我们需要定义一个 boolean变量 mIsPageFinished , 表示数据加载是否结束.
为了保证同一时间只进行一次数据加载过程, 因此我们还需要定义一个 boolean变量 mIsLoading, 表示当前是否已经处于数据加载状态.
明确了 FooterView 的显示和隐藏时机, 也有了控制状态的变量, 代码也就比较容易实现了.
显示时机:
隐藏时机:
实现上拉加载回调接口
这个比较简单, 我们定义一个interface, 便于回调用户真正的加载更多的实现方法.
加载更多结束回调
为了在 PulmListView 中维护数据集合, 必须自定义一个 Adapter, 在 Adapter 中使用 List 存储数据集合, 并提交增删的方法.
自定义的Adapter:
为什么在 addMoreItems 方法中要增加一个isFirstLoad变量呢?
是因为上拉加载更多通常要配合下拉刷新使用.而下拉刷新的过程中会牵扯到 ListView 的数据集合 clear 然后再 addAll.如果没有 isFirstLoad 参数, 那用户下拉刷新去更新 ListView 的数据集合就必须分为两步:
removeAllItems 并进行 notifyDataSetChanged.
addMoreItems 并进行 notifyDataSetChanged.
同一时间连续两次 notifyDataSetChanged 会导致屏幕闪屏, 因此这里提交了一个 isFirstLoad 方法.当是第一次加载数据时, 会先 clear 掉所有的数据, 然后再 addAll, 最后再 notify.
有了自定义的 adapter, 就可以写加载更多结束的回调函数了:
这里需要注意, 当添加了 FooterView 或者 HeaderView 之后, 我们无法通过 listview.getAdapter 拿到我们自定义的 adapter, 必须按照如下步骤:
PulmBaseAdapter adapter = (PulmBaseAdapter) ((HeaderViewListAdapter) getAdapter()).getWrappedAdapter();
参考:
更多https://github.com/nicolasjafelle/PagingListView
每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都会有好心情。
如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。
欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: