下拉刷新
package com.lcj.demo1.view;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.lcj.demo1.R;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PullToRefreshListView extends ListView implements AbsListView.OnScrollListener {
private View headerView;
private View footerView;
private ImageView iv;
private ProgressBar pb;
private int headerViewHeight;
private TextView tv;
private TextView tvTime;
private OnRefreshListener mListener;
int startY = -1;
private static final int PULL_STATE = 0; // 下拉状态
private static final int RELEASE_STATE = 1; // 松开状态
private static final int REFRESHING_STATE = 2; // 刷新状态
private int mCurrentState = PULL_STATE; // 当前状态
private int footerViewHeight;
public PullToRefreshListView(Context context) {
super(context);
initHeadView();
initFootView();
}
public PullToRefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
initHeadView();
initFootView();
}
public PullToRefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initHeadView();
initFootView();
}
private void initHeadView() {
headerView = View.inflate(getContext(), R.layout.header_listview, null);
iv = (ImageView) headerView.findViewById(R.id.iv);
pb = (ProgressBar) headerView.findViewById(R.id.pb);
tv = (TextView) headerView.findViewById(R.id.tv_desc);
tvTime = (TextView) headerView.findViewById(R.id.tv_time);
addHeaderView(headerView);
headerView.measure(0, 0);
headerViewHeight = headerView.getMeasuredHeight();
this.setPadding(0, -headerViewHeight, 0, 0);
tvTime.setText("上次刷新时间:" + getCurrentTime());
}
private void initFootView() {
footerView = View.inflate(getContext(), R.layout.footer_listview, null);
addFooterView(footerView);
footerView.measure(0, 0);
footerViewHeight = footerView.getMeasuredHeight();
footerView.setPadding(0, -footerViewHeight, 0, 0);
this.setOnScrollListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if (startY == -1) {
startY = (int) ev.getRawY();
}
if (mCurrentState == REFRESHING_STATE) {
break;
}
int endY = (int) ev.getRawY();
int dy = endY - startY;
if (dy > 0 && getFirstVisiblePosition() == 0) {
int diff = dy - headerViewHeight;
this.setPadding(0, diff, 0, 0);
if (diff > 0 && mCurrentState != RELEASE_STATE) {
mCurrentState = RELEASE_STATE;
refreshState();
} else if (diff <= 0 && mCurrentState != PULL_STATE) {
mCurrentState = PULL_STATE;
refreshState();
}
}
break;
case MotionEvent.ACTION_UP:
startY = -1;
if (mCurrentState == PULL_STATE) {
this.setPadding(0, -headerViewHeight, 0, 0);
} else if (mCurrentState == RELEASE_STATE) {
mCurrentState = REFRESHING_STATE;
refreshState();
this.setPadding(0, 0, 0, 0);
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
private void refreshState() {
switch (mCurrentState) {
case PULL_STATE:
tv.setText("下拉刷新");
iv.setVisibility(View.VISIBLE);
pb.setVisibility(View.INVISIBLE);
break;
case RELEASE_STATE:
tv.setText("松开刷新");
iv.setVisibility(View.VISIBLE);
pb.setVisibility(View.INVISIBLE);
break;
case REFRESHING_STATE:
tv.setText("正在刷新");
iv.setVisibility(View.INVISIBLE);
pb.setVisibility(View.VISIBLE);
if (mListener != null) {
mListener.onRefresh();
}
break;
default:
break;
}
}
public void setOnRefreshListener(OnRefreshListener listener) {
this.mListener = listener;
}
public interface OnRefreshListener {
public void onRefresh(); // 下拉刷新
public void onLoadMore(); // 加载更多
}
private boolean isLoadMore;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_FLING) {
if (getLastVisiblePosition() == getCount() - 1 && !isLoadMore) { // 到达了最后一条
footerView.setPadding(0, 0, 0, 0);
setSelection(getCount() - 1);
Log.d(PullToRefreshListView.class.getName(), "onScrollStateChanged: " + getCount());
isLoadMore = true;
if (mListener != null) {
mListener.onLoadMore();
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
/**
* 刷新完成
*/
public void onRefreshCompleted() {
if (isLoadMore) {
footerView.setPadding(0, -footerViewHeight, 0, 0);
isLoadMore = false;
} else {
mCurrentState = PULL_STATE;
tv.setText("下拉刷新");
iv.setVisibility(View.VISIBLE);
pb.setVisibility(View.INVISIBLE);
this.setPadding(0, -headerViewHeight, 0, 0);
tvTime.setText("上次刷新时间:" + getCurrentTime());
}
}
private String getCurrentTime() {
SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
return format.format(new Date());
}
}