public class MainActivity extends Activity {
private PullToRefreshListView list_view;
private ArrayList<String> datas;
private int i;
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list_view = (PullToRefreshListView) findViewById(R.id.list_view);
datas = new ArrayList<String>();
// 模擬數據
for (int i = 0; i < 10; i++) {
datas.add(new String("我明天將會擁有" + i * 10 + "千萬"));
}
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas);
list_view.setAdapter(adapter);
list_view.setOnRefreshingListener(new OnRefreshingListener() {
@Override
public void onRefreshing() {
refreshData();
}
@Override
public void onLoadingMore() {
loadMore();
}
});
}
/**
* 模擬開子線程去加載更多的數據
*/
protected void loadMore() {
Toast.makeText(this, "正在加載更多。。。", Toast.LENGTH_LONG).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
datas.add("我是加載更多出來的數據 ");
adapter.notifyDataSetChanged();
list_view.loadMoreComplete();
}
}, 3000);
}
/**
* 模擬開子線程刷新數據
*/
protected void refreshData() {
Toast.makeText(this, "正在刷新數據。。。", Toast.LENGTH_LONG).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
datas.add(0, "我是刷新出來的數據 " + (++i));
adapter.notifyDataSetChanged();
list_view.onRefreshComplete();
}
}, 3000);
}
}
private float downY;
private View headView;
private int headViewHeight;
/** 下拉刷新狀態 */
private static final int STATE_PULL_TO_REFRESH = 0;
/** 鬆開刷新狀態 */
private static final int STATE_RELEASE_TO_REFRESH = 1;
/** 正在刷新狀態 */
private static final int STATE_REFRESHING = 2;
/** 當前狀態(默認是下拉刷新狀態 )*/
private int currentState = STATE_PULL_TO_REFRESH;
/** 是否有移動 */
private boolean hasMove;
private TextView tv_state;
private ImageView iv_arrow;
/** 往上轉:0 ~ -180 */
private RotateAnimation upAnim;
/** 往下轉:-180 ~ -360 */
private RotateAnimation downAnim;
private ProgressBar progressBar;
private OnRefreshingListener listener;
private View footerView;
private int footerViewHeight;
private boolean loadingMore;
public PullToRefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
initHeadView();
initFooterView();
}
private void initFooterView() {
footerView = View.inflate(getContext(), R.layout.foot_view, null);
footerView.measure(0, 0);// 讓系統主動去測量這個View
footerViewHeight = footerView.getMeasuredHeight();
hideFooterView();
addFooterView(footerView);
setOnScrollListener(mOnScrollListener);
}
OnScrollListener mOnScrollListener = new OnScrollListener() {
/** 滑動狀態發生改變 */
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 當處於空閒狀態的時候,並且最後一條可見的item是我們ListView的最後一條數據,把FooterView顯示出來
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE // 處於空閒狀態了
&& getLastVisiblePosition() == getCount() - 1// 最後一條可見的item的索引是ListView的最後一條數據的索引
&& !loadingMore) {// 沒有正在加載
showFooterView();
setSelection(getCount() - 1);// 選擇ListView的最後一個Item,它會自動滾動ListView
loadingMore = true;
if (listener != null) {
listener.onLoadingMore();
}
System.out.println("正在加載更多。。。");
}
}
/** 正在滑動 */
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
};
private void hideFooterView() {
setFooterViewPaddingTop(-footerViewHeight);
}
private void showFooterView() {
setFooterViewPaddingTop(0);
}
private void setFooterViewPaddingTop(int top) {
footerView.setPadding(0, top, 0, 0);
}
private void initHeadView() {
headView = View.inflate(getContext(), R.layout.head_view, null);
tv_state = (TextView) headView.findViewById(R.id.tv_state);
iv_arrow = (ImageView) headView.findViewById(R.id.iv_arrow);
progressBar = (ProgressBar) headView.findViewById(R.id.progress_bar);
headView.measure(0, 0);// 讓系統主動去測量這個View
headViewHeight = headView.getMeasuredHeight();
hideHeadView();
addHeaderView(headView);
initAnimator();
}
private void initAnimator() {
upAnim = createRotateAnimator(0, -180);
downAnim = createRotateAnimator(-180, -360);
}
/**
* 創建一個旋轉動畫
* @param fromDegrees 旋轉的開始角度
* @param toDegrees 旋轉的結束角度
*/
private RotateAnimation createRotateAnimator(float fromDegrees, float toDegrees) {
int pivotXType = RotateAnimation.RELATIVE_TO_SELF;// 旋轉點x方向的參數物
int pivotYType = RotateAnimation.RELATIVE_TO_SELF;// 旋轉點y方向的參數物
float pivotXValue = 0.5f;// 旋轉點x方向的位置
float pivotYValue = 0.5f;// 旋轉點y方向的位置
RotateAnimation ra = new RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue);
ra.setFillAfter(true);// 讓動畫保持在結束的樣子
ra.setDuration(300);
return ra;
}
/** 隱藏HeadView */
private void hideHeadView() {
setHeadViewPaddingTop(-headViewHeight);
}
/** 顯示HeadView */
private void showHeadView() {
setHeadViewPaddingTop(0);
}
/** 設置HeadView的paddingTop */
private void setHeadViewPaddingTop(int top) {
headView.setPadding(0, top, 0, 0);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
float distanceY = ev.getY() - downY;
// 當往下滑動,並且第一條可以的item是索引爲第1條的數據,這個時候才需要顯示HeadView
if (distanceY > 0 && getFirstVisiblePosition() == 0) {
hasMove = true;
// 下拉顯示HeadView的原理:-HeadView.height + 往下移動的距離
int paddingTop = (int) (-headViewHeight + distanceY);
setHeadViewPaddingTop(paddingTop);
if (paddingTop < 0 && currentState != STATE_PULL_TO_REFRESH) {
// 如果paddingTop小於0,說明HeadView沒有完全顯示,進入下拉刷新狀態
currentState = STATE_PULL_TO_REFRESH;
tv_state.setText("下拉刷新");
showArrow(true);
iv_arrow.startAnimation(downAnim);
} else if (paddingTop >= 0 && currentState != STATE_RELEASE_TO_REFRESH) {
// 如果如果paddingTop大於或者等於0,說明HeadView完全顯示出來,進入鬆開刷新狀態
currentState = STATE_RELEASE_TO_REFRESH;
tv_state.setText("鬆開刷新");
showArrow(true);
iv_arrow.startAnimation(upAnim);
}
return true;
}
break;
case MotionEvent.ACTION_UP:
if (hasMove) {
// 如果有移動HeadView的操作才需要做下面的事件
if (currentState == STATE_RELEASE_TO_REFRESH) {
// 如果當前狀態是鬆開刷新狀態,並且擡起了手,則進入正在刷新狀態
currentState = STATE_REFRESHING;
tv_state.setText("正在刷新");
if (listener != null) {
listener.onRefreshing();
}
showArrow(false);
showHeadView();
} else if (currentState == STATE_PULL_TO_REFRESH) {
hideHeadView();
}
}
break;
}
return super.onTouchEvent(ev);
}
/**
* 設置是否顯示箭頭,如果顯示了箭頭,則隱藏progressBar,如果不顯示箭頭,則顯示progressBar
* @param isShowArrow 如果爲true則顯示箭頭
*/
private void showArrow(boolean isShowArrow) {
iv_arrow.setVisibility(isShowArrow ? View.VISIBLE : View.INVISIBLE);
progressBar.setVisibility(!isShowArrow ? View.VISIBLE : View.INVISIBLE);
if (!isShowArrow) {
// 如果是要顯示progressBar的話則把箭頭的動畫消除
iv_arrow.clearAnimation();
}
}
/**
* 設置正在刷新的監聽器
* @param listener
*/
public void setOnRefreshingListener(OnRefreshingListener listener) {
this.listener = listener;
}
public interface OnRefreshingListener {
/** 正在刷新的時候會回調這個方法 */
void onRefreshing();
/** 加載更多的時候會回調這個方法 */
void onLoadingMore();
}
/** 數據刷新完成 了 */
public void onRefreshComplete() {
hideHeadView();
currentState = STATE_PULL_TO_REFRESH;
}
/**
* 加載更多完成了
*/
public void loadMoreComplete() {
hideFooterView();
loadingMore = false;
}
}