Android ListView下拉刷新上拉加载更多的实现
2014-03-01 12:09
615 查看
import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.AbsListView; import android.widget.ListAdapter; import android.widget.ListView; public class PullRefreshListView extends ListView implements View.OnTouchListener, AbsListView.OnScrollListener { public static interface OnPullListener { /*刷新 *@param 滑动的距离绝对值 */ public void toRefresh(float movedDistance); /*加载更多 *@param 滑动的距离绝对值 */ public void toLoadMore(float movedDistance); } //是否处于刷新状态 private boolean isRefresh; //是否处于加载更多状态 private boolean isLoadMore; //Down触摸事件的Y坐标 private float startY; //滑动的距离 private float distanceY; //刷新及加载更多的回调接口 private OnPullListener pullListener; public PullRefreshListView(Context context) { super(context); init(); } public PullRefreshListView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public PullRefreshListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { setOnScrollListener(this); setOnTouchListener(this); } public void setOnPullListener(OnPullListener pullListener) { this.pullListener = pullListener; } @Override public void setAdapter(ListAdapter adapter) { super.setAdapter(adapter); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { isRefresh = false; isLoadMore = false; switch (scrollState) { case SCROLL_STATE_TOUCH_SCROLL: case SCROLL_STATE_IDLE: if (getFirstVisiblePosition() == 0) { isRefresh = true; } if (getAdapter()!=null&&getLastVisiblePosition() == getAdapter().getCount() - 1) { isLoadMore = true; } break; default: break; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } @Override public boolean onTouch(View v, MotionEvent event) { if (pullListener == null) { return super.onTouchEvent(event); } if (isRefresh || isLoadMore) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: distanceY = 0; startY = event.getY(); break; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: distanceY = event.getY() - startY; if (distanceY >= 0) { pullListener.toRefresh(distanceY); } else { pullListener.toLoadMore(-distanceY); } break; default: break; } } return super.onTouchEvent(event); } }
相关文章推荐
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- 完美实现Android ListView中的TextView的跑马灯效果
- 解決Linux下Android开发真机调试设备不被识别问题
- [Android]在代码里运行另一个程序的方法
- [软件咨询]WPS2012正式版已发布 金山Office移动版4.0发布
- Android笔记-Linux Kernel Ftrace (Function Trace)解析
- android USB如何修改VID具体实现
- Android增量升级的方法和原理详细介绍
- Android Mouse实现过程详细笔记
- 深入Android Browser配置管理的详解
- Android Mms之:深入理解对话列表管理
- Android APP与媒体存储服务的交互
- android 多线程技术应用
- Android之采用execSQL与rawQuery方法完成数据的添删改查操作详解
- Android数据类型之间相互转换系统介绍
- 通过Android trace文件分析死锁ANR实例过程
- Android实现左右滑动效果的方法详解
- Android 各国语言缩写及简称详细介绍