下拉刷新


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;

}


}











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章