Android UI--自定义ListView(实现下拉刷新+加载更多),framework框架

本文介绍了如何在Android应用中自定义ListView,实现下拉刷新和加载更多的功能。通过设置头部和尾部视图,监听触摸事件并调整头部视图的padding来模拟下拉刷新的效果。同时,提供了接口供外部刷新和加载更多数据时调用。此外,还展示了具体的布局文件和使用方法。
摘要由CSDN通过智能技术生成

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值