系列文章
- Android开源在线音乐播放器——波尼音乐
- Android开源音乐播放器之播放器基本功能
- Android开源音乐播放器之高仿云音乐黑胶唱片
- Android开源音乐播放器之自动滚动歌词
- Android开源音乐播放器之在线音乐列表自动加载更多
前言
当我们的ListView数据比较多时,我们一般都会选择分页显示,而分页显示就需要一个动作触发加载更多操作,通常我们会使用上拉加载更多,但我觉得不够人性化,因为用户需要手动上拉,所以更加人性化的方案应该是列表滚动到底部自动加载更多。我们以在线音乐列表为例,由于不需要刷新,因此这里我们不讨论刷新功能。
思路分析
触发自动加载后,需要在ListView底部显示一个进度条,表示正在加载。我们最容易想到的办法就是给ListView添加FooterView,这也是最直接的办法。但ListView的addFooterView方法有一个限制,必须在setAdapter之前调用,而我们显示正在加载进度条前,肯定要先给ListView设置适配器,这样就比较尴尬了。这时我们就要用到ListView的另一个特性了,那就是虽然不能在setAdapter之后调用addFooterView,但可以在setAdapter之前调用addFooterView,紧接着调用removeFooterView,将进度条隐藏掉,然后就可以随时调用addFooterView,而不管setAdapter是否已经被调用。
代码实现
public class AutoLoadListView extends ListView implements AbsListView.OnScrollListener {
private static final String TAG = AutoLoadListView.class.getSimpleName();
private View vFooter;
private OnLoadListener mListener;
private int mFirstVisibleItem = 0;
private boolean mEnableLoad = true;
private boolean mIsLoading = false;
public AutoLoadListView(Context context) {
super(context);
init();
}
// 其他构造函数...
private void init() {
vFooter = LayoutInflater.from(getContext()).inflate(R.layout.auto_load_list_view_footer, null);
addFooterView(vFooter, null, false);
setOnScrollListener(this);
onLoadComplete();
}
public void setOnLoadListener(OnLoadListener listener) {
mListener = listener;
}
public void onLoadComplete() {
Log.d(TAG, "onLoadComplete");
mIsLoading = false;
removeFooterView(vFooter);
}
public void setEnable(boolean enable) {
mEnableLoad = enable;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
boolean isPullDown = firstVisibleItem > mFirstVisibleItem;
if (mEnableLoad && !mIsLoading && isPullDown) {
int lastVisibleItem = firstVisibleItem + visibleItemCount;
if (lastVisibleItem >= totalItemCount - 1) {
onLoad();
}
}
mFirstVisibleItem = firstVisibleItem;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
private void onLoad() {
Log.d(TAG, "onLoad");
mIsLoading = true;
addFooterView(vFooter, null, false);
if (mListener != null) {
mListener.onLoad();
}
}
}
代码不长,就把它全部贴出来了,逻辑处理主要在onScroll
函数里,首先根据上一个firstVisibleItem和当前的firstVisibleItem可以判断列表是否在向上滚动,然后比较firstVisibleItem + visibleItemCount和totalItemCount的大小可以判断列表是否滚动到了底部(即最后一个item已经可见),如果是向上滚动,滚动到了最后一条,且没有触发正在加载时,就可以触发自动加载更多了。
我们来看下效果图

大家可以运行源码或下载波尼音乐查看详细效果。
网友评论