




已阅读5页,还剩100页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.view.animation.DecelerateInterpolator;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.RelativeLayout;import android.widget.Scroller;import android.widget.TextView;import com.insthub.ecmobile.R;import android.os.Message;import android.os.Handler;public class XListView extends ListView implements OnScrollListener private float mLastY = -1; / save event y private Scroller mScroller; / used for scroll back private OnScrollListener mScrollListener; / users scroll listener / the interface to trigger refresh and load more. private IXListViewListener mListViewListener; / - header view private XListViewHeader mHeaderView; / header view content, use it to calculate the Headers height. And hide it / when disable pull refresh. private RelativeLayout mHeaderViewContent; private TextView mHeaderTimeView; private int mHeaderViewHeight; / header views height private boolean mEnablePullRefresh = true; private boolean mPullRefreshing = false; / is refreashing. / - footer view private XListViewFooter mFooterView; private boolean mEnablePullLoad; private boolean mPullLoading; private boolean mIsFooterReady = false; / total list items, used to detect is at the bottom of listview. private int mTotalItemCount; / for mScroller, scroll back from header or footer. private int mScrollBack; private final static int SCROLLBACK_HEADER = 0; private final static int SCROLLBACK_FOOTER = 1; private final static int SCROLL_DURATION = 400; / scroll back duration private final static int PULL_LOAD_MORE_DELTA = 50; / when pull up = 50px / at bottom, trigger / load more. private final static float OFFSET_RADIO = 1.8f; / support iOS like pull / feature. private int id; /* * param context */ public XListView(Context context) super(context); initWithContext(context); public XListView(Context context, AttributeSet attrs) super(context, attrs); initWithContext(context); public XListView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle); initWithContext(context); private void initWithContext(Context context) mScroller = new Scroller(context, new DecelerateInterpolator(); / XListView need the scroll event, and it will dispatch the event to / users listener (as a proxy). super.setOnScrollListener(this); / init header view mHeaderView = new XListViewHeader(context); mHeaderViewContent = (RelativeLayout) mHeaderView .findViewById(R.id.xlistview_header_content); mHeaderTimeView = (TextView) mHeaderView .findViewById(R.id.xlistview_header_time); addHeaderView(mHeaderView); / init footer view mFooterView = new XListViewFooter(context); / init header height mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() Override public void onGlobalLayout() mHeaderViewHeight = mHeaderViewContent.getHeight(); getViewTreeObserver() .removeGlobalOnLayoutListener(this); ); Override public void setAdapter(ListAdapter adapter) / make sure XListViewFooter is the last footer view, and only add once. if (mIsFooterReady = false) mIsFooterReady = true; addFooterView(mFooterView); super.setAdapter(adapter); /* * enable or disable pull down refresh feature. * * param enable */ public void setPullRefreshEnable(boolean enable) mEnablePullRefresh = enable; if (!mEnablePullRefresh) / disable, hide the content mHeaderViewContent.setVisibility(View.INVISIBLE); else mHeaderViewContent.setVisibility(View.VISIBLE); /* * enable or disable pull up load more feature. * * param enable */ public void setPullLoadEnable(boolean enable) mEnablePullLoad = enable; if (!mEnablePullLoad) mFooterView.hide(); mFooterView.setOnClickListener(null); else mPullLoading = false; mFooterView.show(); mFooterView.setState(XListViewFooter.STATE_NORMAL); / both pull up and click will invoke load more. mFooterView.setOnClickListener(new OnClickListener() Override public void onClick(View v) startLoadMore(); ); /* * stop refresh, reset header view. */ public void stopRefresh() if (mPullRefreshing = true) mPullRefreshing = false; resetHeaderHeight(); /* * stop load more, reset footer view. */ public void stopLoadMore() if (mPullLoading = true) mPullLoading = false; mFooterView.setState(XListViewFooter.STATE_NORMAL); mFooterView.setEnabled(true); /* * set last refresh time * * param time */ public void setRefreshTime() /mHeaderTimeView.setText(new Date().toLocaleString(); mHeaderTimeView.setText(date(); / 获取系统时间 public String date() SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); Date date = new Date(); String t = sdf.format(date); return t; private void invokeOnScrolling() if (mScrollListener instanceof OnXScrollListener) OnXScrollListener l = (OnXScrollListener) mScrollListener; l.onXScrolling(this); private void updateHeaderHeight(float delta) mHeaderView.setVisiableHeight(int) delta + mHeaderView.getVisiableHeight(); if (mEnablePullRefresh & !mPullRefreshing) / 未处于刷新状态,更新箭头 if (mHeaderView.getVisiableHeight() mHeaderViewHeight) mHeaderView.setState(XListViewHeader.STATE_READY); else mHeaderView.setState(XListViewHeader.STATE_NORMAL); setSelection(0); / scroll to top each time /* * reset header views height. */ private void resetHeaderHeight() int height = mHeaderView.getVisiableHeight(); if (height = 0) / not visible. return; / refreshing and header isnt shown fully. do nothing. if (mPullRefreshing & height mHeaderViewHeight) finalHeight = mHeaderViewHeight; mScrollBack = SCROLLBACK_HEADER; mScroller.startScroll(0, height, 0, finalHeight - height, SCROLL_DURATION); / trigger computeScroll invalidate(); private void updateFooterHeight(float delta) int height = mFooterView.getBottomMargin() + (int) delta; if (mEnablePullLoad & !mPullLoading) if (height PULL_LOAD_MORE_DELTA) / height enough to invoke load / more. mFooterView.setState(XListViewFooter.STATE_READY); else mFooterView.setState(XListViewFooter.STATE_NORMAL); mFooterView.setBottomMargin(height);/ setSelection(mTotalItemCount - 1); / scroll to bottom private void resetFooterHeight() int bottomMargin = mFooterView.getBottomMargin(); if (bottomMargin 0) mScrollBack = SCROLLBACK_FOOTER; mScroller.startScroll(0, bottomMargin, 0, -bottomMargin, SCROLL_DURATION); invalidate(); public void startLoadMore() mPullLoading = true; mFooterView.setState(XListViewFooter.STATE_LOADING); if (mListViewListener != null) mListViewListener.onLoadMore(id); mFooterView.setEnabled(false); Handler mHandler = new Handler() Override public void handleMessage(Message msg) super.handleMessage(msg); XListView.this.stopLoadMore(); ; mHandler.sendEmptyMessageDelayed(0, 4000); Override public boolean onTouchEvent(MotionEvent ev) if (mLastY = -1) mLastY = ev.getRawY(); switch (ev.getAction() case MotionEvent.ACTION_DOWN: mLastY = ev.getRawY(); break; case MotionEvent.ACTION_MOVE: final float deltaY = ev.getRawY() - mLastY; mLastY = ev.getRawY(); if (getFirstVisiblePosition() = 0 & (mHeaderView.getVisiableHeight() 0 | deltaY 0) / the first item is showing, header has shown or pull down. updateHeaderHeight(deltaY / OFFSET_RADIO); invokeOnScrolling(); else if (getLastVisiblePosition() = mTotalItemCount - 1 & (mFooterView.getBottomMargin() 0 | deltaY mHeaderViewHeight) mPullRefreshing = true; mHeaderView.setState(XListViewHeader.STATE_REFRESHING); if (mListViewListener != null) mListViewListener.onRefresh(id); Handler mHandler = new Handler() Override public void handleMessage(Message msg) super.handleMessage(msg); XListView.this.stopRefresh(); ; mHandler.sendEmptyMessageDelayed(0, 4000); resetHeaderHeight(); else if (getLastVisiblePosition() = mTotalItemCount - 1) / invoke load more. if (mEnablePullLoad & mFooterView.getBottomMargin() PULL_LOAD_MORE_DELTA) if(mFooterView.isEnabled() startLoadMore(); resetFooterHeight(); break; return super.onTouchEvent(ev); Override public void computeScroll() if (mSputeScrollOffset() if (mScrollBack = SCROLLBACK_HEADER) mHeaderView.setVisiableHeight(mScroller.getCurrY(); else mFooterView.setBottomMargin(mScroller.getCurrY(); postInvalidate(); invokeOnScrolling(); puteScroll(); Override public void setOnScrollListener(OnScrollListener l) mScrollListener = l; Override public void onScrollStateChanged(AbsListView view, int scrollState) if (mScrollListener != null) mScrollListener.onScrollStateChanged(view, scrollState); Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) / send to users listener mTotalItemCount = totalItemCount; if (mScrollListener != null) mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); public void setXListViewListener(IXListViewListener l,int id) mListViewListener = l; this.id = id; /* * you can listen ListView.OnScrollListener or this one. it will invoke * onXScrolling when header/footer scroll back. */ public interface OnXScrollListener extends OnScrollListener public void onXScrolling(View view); /* * implements this interface to get refresh/load more event. */ public interface IXListViewListener public void onRefresh(int id); public void onLoadMore(int id); import android.content.Context;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.view.animation.DecelerateInterpolator;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.RelativeLayout;import android.widget.Scroller;import android.widget.TextView;import com.insthub.ecmobile.R;public class XListViewCart extends ListView implements OnScrollListener private float mLastY = -1; / save event y private Scroller mScroller; / used for scroll back private OnScrollListener mScrollListener; / users scroll listener / the interface to trigger refresh and load more. private IXListViewListenerCart mListViewListener; / - header view private XListViewHeaderCart mHeaderView; / header view content, use it to calculate the Headers height. And hide it / when disable pull refresh. private RelativeLayout mHeaderViewContent; private TextView mHeaderTimeView; private int mHeaderViewHeight; / header views height private boolean mEnablePullRefresh = true; private boolean mPullRefreshing = false; / is refreashing. / - footer view private XListViewFooter mFooterView; private boolean mEnablePullLoad; private boolean mPullLoading; private boolean mIsFooterReady = false; / total list items, used to detect is at the bottom of listview. private int mTotalItemCount; / for mScroller, scroll back from header or footer. private int mScrollBack; private final static int SCROLLBACK_HEADER = 0; private final static int SCROLLBACK_FOOTER = 1; private final static int SCROLL_DURATION = 400; / scroll back duration private final static int PULL_LOAD_MORE_DELTA = 50; / when pull up = 50px / at bottom, trigger / load more. private final static float OFFSET_RADIO = 1.8f; / support iOS like pull / feature. private int id; /* * param context */ public XListViewCart(Context context) super(context); initWithContext(context); public XListViewCart(Context context, AttributeSet attrs) super(context, attrs); initWithContext(context); public XListViewCart(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle); initWithContext(context); private void initWithContext(Context context) mScroller = new Scroller(context, new DecelerateInterpolator(); / XListView need the scroll event, and it will dispatch the event to / users listener (as a proxy). super.setOnScrollListener(this); / init header view mHeaderView = new XListViewHeaderCart(context); mHeaderViewContent = (RelativeLayout) mHeaderView .findViewById(R.id.xlistview_header_content); mHeaderTimeView = (TextView) mHeaderView .findViewById(R.id.xlistview_header_time); addHeaderView(mHeaderView); / init footer view mFooterView = new XListViewFooter(context); / init header height mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() Override public void onGlobalLayout() mHeaderViewHeight = mHeaderViewContent.getHeight(); getVi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025绿色农产品买卖合同
- 部编统编一下语文口语交际请你帮个忙名师教学设计公开课教案(2025-2026学年)
- 二手房屋买卖标准合同
- Unit 5 Experiencing Literature说课稿-2025-2026学年高中英语冀教版必修二-冀教版2004
- 主题班会教案主题班会我想飞得更高教案(2025-2026学年)
- 选听 心依恋说课稿-2025-2026学年初中音乐人教版七年级下册-人教版
- 小海豚顶球规则游戏公开课教案教学设计(2025-2026学年)
- Unit 5 What were you doingSection A (3a-3c) 教学设计2023-2024学年人教版英语八年级下册
- 跨学科实践活动:栽种草莓探究影响草莓生长的环境条件 说课稿-2024-2025学年苏科版生物七年级下册
- 浙教版科学八上1.3 水的浮力 配套说课稿
- 2025年中移铁通有限公司甘肃分公司社会招聘考试参考题库及答案解析
- 酒店治安管理制度模板
- 2025年社区网格工作人员考试题库及答案
- 小学生心理团辅方案与记录模板
- 2025年淮南市大通区和寿县经开区公开招聘社区“两委”后备干部30名备考考试题库附答案解析
- 国防科大优势课件
- 医疗器械财务汇报
- 消毒供应中心包装课件
- 人教PEP版(2024)三年级上册英语教案全册教案
- 河道生态修复工程重点难点分析
- 配电箱保养安全培训课件
评论
0/150
提交评论