(TextView) mRefreshHeaderView.findViewById(R.id.pull_to_refresh_updated_at);
mLoadMoreFooterView = (RelativeLayout) mInflater.inflate(
R.layout.loadmore_footer, this, false);
mLoadMoreText = (TextView) mLoadMoreFooterView.findViewById(R.id.loadmore_text);
mLoadMoreProgress = (ProgressBar) mLoadMoreFooterView.findViewById(R.id.loadmore_progress);
mRefreshViewImage.setMinimumHeight(50); // 设置图片最小高度
mRefreshHeaderView.setOnClickListener(new OnClickRefreshListener());
mRefreshOriginalTopPadding = mRefreshHeaderView.getPaddingTop();
mLoadMoreFooterView.setOnClickListener(new OnClickLoadMoreListener());
mRefreshState = TAP_TO_REFRESH; // 初始刷新状态
mLoadState = TAP_TO_LOADMORE;
addHeaderView(mRefreshHeaderView); // 增加头部视图
addFooterView(mLoadMoreFooterView); // 增加尾部视图
super.setOnScrollListener(this);
measureView(mRefreshHeaderView); // 测量视图
mRefreshViewHeight = mRefreshHeaderView.getMeasuredHeight(); // 得到视图的高度
}
@Override
protected void onAttachedToWindow() {
setSelection(1); // 设置当前选中的项
}
@Override
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
setSelection(1);
}
/**
-
Set the listener that will receive notifications every time the list
-
scrolls.
-
@param l The scroll listener.
*/
@Override
public void setOnScrollListener(AbsListView.OnScrollListener l) {
mOnScrollListener = l;
}
/**
-
Register a callback to be invoked when this list should be refreshed.
-
注册监听器
-
@param onRefreshListener The callback to run.
*/
public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
mOnRefreshListener = onRefreshListener;
}
/**
-
Set a text to represent when the list was last updated.
-
设置一个文本来表示最近更新的列表,显示的是最近更新列表的时间
-
@param lastUpdated Last updated at.
*/
public void setLastUpdated(CharSequence lastUpdated) {
if (lastUpdated != null) {
mRefreshViewLastUpdated.setVisibility(View.VISIBLE);
mRefreshViewLastUpdated.setText("更新于: " + lastUpdated);
} else {
mRefreshViewLastUpdated.setVisibility(View.GONE);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int y = (int) event.getY(); // 获取点击位置的Y坐标
switch (event.getAction()) {
case MotionEvent.ACTION_UP: // 手指抬起
if (!isVerticalScrollBarEnabled()) {
setVerticalScrollBarEnabled(true);
}
if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
if ((mRefreshHeaderView.getBottom() > mRefreshViewHeight
|| mRefreshHeaderView.getTop() >= 0)
&& mRefreshState == RELEASE_TO_REFRESH) {
// Initiate the refresh
mRefreshState = REFRESHING; // 刷新状态
prepareForRefresh();
onRefresh();
} else if (mRefreshHeaderView.getBottom() < mRefreshViewHeight
|| mRefreshHeaderView.getTop() < 0) {
// Abort refresh and scroll down below the refresh view
resetHeader();
setSelection(1);
}
}
break;
case MotionEvent.ACTION_DOWN:
mLastMotionY = y;
break;
case MotionEvent.ACTION_MOVE:
applyHeaderPadding(event);
break;
}
return super.onTouchEvent(event);
}
private void applyHeaderPadding(MotionEvent ev) {
final int historySize = ev.getHistorySize();
// Workaround for getPointerCount() which is unavailable in 1.5