Android ListView 上拉加载更多

作者: zhangxiao | 来源:发表于2017-04-02 19:55 被阅读0次
GIF.gif

概述

在网上没有找到合适的上拉刷新代码,所以自己写一个,话不多说上Demo先:
https://github.com/zh-xiao/ExListView

缕一下思路

既然要实现一个可以上拉刷新的ListView,最简单的就是继承ListView:
1.通过addFooterView方法加载底部布局
2.通过removeFooterView移除布局
3.onScrollStateChanged:
if(最后一条可见item==最后一条item)&&(停止滑动)&&(!加载数据中)&&(!所有条目都可见){
addFooterView();
加载数据;
}
4.监听器OnLoadMoreListener:
if(数据加载完成){
removeFooterVeiw();
}

贴代码

package com.example.xiao.exlistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;

/**
 * Created by xiao on 2017年3月31日,0031.
 */

public class ExListView extends ListView implements AbsListView.OnScrollListener {

    //是否加载中或已加载所有数据
    private boolean mIsLoadingOrComplete;
    //是否所有条目都可见
    private boolean mIsAllVisible;

    private OnLoadMoreListener mOnLoadMoreListener;
    private View mLoadMoreView;
    private View mLoadCompleteView;

    public ExListView(Context context) {
        super(context);
        init(context);
    }

    public ExListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public ExListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    //加载更多回调接口
    public interface OnLoadMoreListener {
        void loadMore();
    }

    //初始化
    private void init(Context context) {
        mLoadMoreView = LayoutInflater.from(context).inflate(R.layout.load_more, null);
        mLoadCompleteView = LayoutInflater.from(context).inflate(R.layout.load_complete, null);
        setOnScrollListener(this);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        //(最后一条可见item==最后一条item)&&(停止滑动)&&(!加载数据中)&&(!所有条目都可见)
        if (view.getLastVisiblePosition() == getAdapter().getCount() - 1 && scrollState == SCROLL_STATE_IDLE && !mIsLoadingOrComplete && !mIsAllVisible) {
            if (null != mOnLoadMoreListener) {
                //加载更多(延时1.5秒,防止加载速度过快导致加载更多布局闪现)
                mIsLoadingOrComplete = true;
                postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mOnLoadMoreListener.loadMore();
                    }
                }, 1500);
            }
        }
        if (getFooterViewsCount() == 0 && !mIsAllVisible) addFooterView(mLoadMoreView);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        mIsAllVisible = totalItemCount == visibleItemCount;
    }

    /**
     * 加载更多回调
     *
     * @param onLoadMoreListener 加载更多回调接口
     */
    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        mOnLoadMoreListener = onLoadMoreListener;
    }

    /**
     * 通知此次加载完成,remove footerView
     *
     * @param allComplete 是否已加载全部数据
     */
    public void setLoadCompleted(final boolean allComplete) {
        if (allComplete && getFooterViewsCount() != 0) {
            removeFooterView(mLoadMoreView);
            removeFooterView(mLoadCompleteView);
            addFooterView(mLoadCompleteView);
        } else {
            mIsLoadingOrComplete = false;
        }
    }
}

最后

嗯,如果有建议,请多多指教O(∩_∩)O

相关文章

网友评论

    本文标题:Android ListView 上拉加载更多

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