效果圖如下:
1,自定義ListView
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
/**
* Created by HeDongDong on 2017/3/29.
*/
public class MyListView extends ListView implements OnScrollListener {
private LoadMoreListener loadMoreListener;
//是否可加載更多
private boolean canLoadMore = true;
//加載更多佈局
private LoadingMoreFooter loadingMoreFooter;
//正在加載數據中
private boolean isLoadingData = false;
private int firstVisibleItem;
public MyListView(Context context) {
super(context, null);
init(context);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
init(context);
}
public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
loadingMoreFooter = new LoadingMoreFooter(context);
//設置自定義加載中效果
ProgressView progressView = new ProgressView(context);
progressView.setIndicatorId(ProgressView.BallPulse); //動畫效果 自己可以嘗試各種風格
progressView.setIndicatorColor(ContextCompat.getColor(context, R.color.colorAccent));//動畫顏色
loadingMoreFooter.addFootLoadingView(progressView);
}
//移除加載更多佈局
public void removeFooter() {
canLoadMore = false;
this.removeFooterView(loadingMoreFooter);
}
//添加加載更多佈局 在removeFooter()後調用
public void addFooter() {
canLoadMore = true;
this.addFooterView(loadingMoreFooter);
}
//下拉刷新後初始化底部狀態
public void refreshComplete() {
if (loadingMoreFooter != null) {
loadingMoreFooter.setGone();
}
isLoadingData = false;
}
//上拉加載後初始化底部狀態
public void loadMoreComplete() {
if (loadingMoreFooter != null) {
loadingMoreFooter.setGone();
}
isLoadingData = false;
}
//到底了
public void loadMoreEnd() {
if (loadingMoreFooter != null) {
loadingMoreFooter.setEnd();
}
}
//設置底部加載中效果
public void setFootLoadingView(View view) {
if (loadingMoreFooter != null) {
loadingMoreFooter.addFootLoadingView(view);
}
}
//設置加載更多監聽
public void setLoadMoreListener(LoadMoreListener listener) {
loadMoreListener = listener;
addFooterView(loadingMoreFooter);
loadingMoreFooter.setGone();
setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//判斷 isLoadingData:不在加載中 ,scrollState:整個滾動事件結束,firstVisibleItem:條目至少上滑一條 canLoadMore:可以加載更多
if (!isLoadingData && scrollState == OnScrollListener.SCROLL_STATE_IDLE &&
firstVisibleItem != 0 && canLoadMore) {
if (loadMoreListener != null) {
if (loadingMoreFooter != null) {
loadingMoreFooter.setVisible();
}
isLoadingData = true;
loadMoreListener.onLoadMore();
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int
totalItemCount) {
//firstVisibleItem表示在屏幕第一個ListItem(部分顯示的ListItem也算)在整個ListView的位置(下標從0開始)
this.firstVisibleItem = firstVisibleItem;
}
}
2,用法
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private SwipeRefreshLayout swipeRefreshLayout;
private MyListView myListView;
private List<String> list = new ArrayList();
private MainAdapter adapter;
private int mIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl);
//設置圈圈顏色
swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary,
R.color.colorAccent, R.color.colorPrimary,
R.color.colorAccent);
myListView = (MyListView) findViewById(R.id.lv);
adapter = new MainAdapter(this, list);
myListView.setAdapter(adapter);
generateData();
setOnClickListener();
}
private void setOnClickListener() {
/**
* 下拉刷新
*/
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mIndex = 0;
list.clear();
generateData();
adapter.notifyDataSetChanged();
//刷新完成
swipeRefreshLayout.setRefreshing(false);
myListView.refreshComplete();
}
}, 1500);
}
});
/**
* 上拉加載更多
*/
myListView.setLoadMoreListener(new LoadMoreListener() {
@Override
public void onLoadMore() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (mIndex < 30) {
generateData();
adapter.notifyDataSetChanged();
//設置loading完成
myListView.loadMoreComplete();
} else {
//設置加載到底
myListView.loadMoreEnd();
}
}
}, 1500);
}
});
}
/**
* 生成數據
*/
private void generateData() {
for (int i = 0; i < 15; i++) {
list.add("數據" + mIndex++);
}
}
}
3,其中加載效果使用的是開源庫 在Module gradle加上
compile 'com.wang.avi:library:1.0.1'
4, 詳見demo
最後感謝fangxiao大神,從他的Haorecyclerview中吸取很多東西!卻忘了鏈接,知道的幫忙貼一下,謝謝!