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