美文网首页音视频
Android开源音乐播放器之在线音乐列表自动加载更多

Android开源音乐播放器之在线音乐列表自动加载更多

作者: 王晨彦 | 来源:发表于2016-06-09 23:26 被阅读3768次

系列文章

前言

当我们的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已经可见),如果是向上滚动,滚动到了最后一条,且没有触发正在加载时,就可以触发自动加载更多了。
我们来看下效果图

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

相关文章

网友评论

  • 10fb6be28800:您好呀。我要开发安卓本地和在线播放器。如果你愿意的话,帮我开发。我给费用给你。我电话:18970085328,请打电话给我沟通。我是开发智能家居。
  • c63291455bcb:请问边播边缓存的功能有没有实现呢?
    c63291455bcb:@ChayWong OK,谢谢。
    王晨彦:@Pan先森々 还没有
  • e6f9e565643a:请问是在那个类中的那个方法,实现的在线音乐列表更新的呢?
    王晨彦:@elegant_831f 你好,麻烦你自己看下源码。
  • f791d7d66101:您好,我想问一下您的在线下载使用了SQLite数据库了吗?
    f791d7d66101: @霸爱 哦哦,谢谢您了
    王晨彦:没有的。
  • 0青衣小褂0:lastVisibleItem = firstVisibleItem + visibleItemCount;这句话个view.getLastVisiableItem();有什么区别呢
    0青衣小褂0: @ChayWong 3q
    王晨彦:你说的是 ListView.getLastVisiblePosition() 吧,firstVisibleItem + visibleItemCount 应该是等于 getLastVisiblePosition()+1 的,你可以试一哈~
  • f802d51504b6:请问大神是怎么实现在线音乐播放的?
    f802d51504b6:@ChayWong 哦好的
    王晨彦:@远音至诚 大神不敢当 :smile: ,MediaPlayer原生支持播放流媒体音乐的。
  • 原来是控控:兄弟做安卓多久啦
    原来是控控:@ChayWong 厉害哦
    王晨彦:@原来是控控 大概一两年吧,在学校自学的,都是小打小闹 :smile:

本文标题:Android开源音乐播放器之在线音乐列表自动加载更多

本文链接:https://www.haomeiwen.com/subject/uhojdttx.html