Android ListView 上拉加載更多

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容