Android菜鸟之listview下拉刷新
来源:互联网 发布:数据恢复大师怎么样 编辑:程序博客网 时间:2024/05/21 01:29
《1》首先我们要写一个自定义的listview(写一个类继承ListView类)
public class RefreshListView extends ListView
然后我们需要填充这个RefreshListView
class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return dataList.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView tv = new TextView(MainActivity.this);tv.setText(dataList.get(position));tv.setTextSize(18);return tv;}}
显示基本的数据列表
2》自定义RefreshListView 的头
/** * 初始化ListView的頭佈局 */private void initHeader() {headView=LayoutInflater.from(getContext()).inflate(R.layout.listview_header, null);ivArrow = (ImageView) headView.findViewById(R.id.iv_listview_header_arrow);//ivArrow.setMinimumWidth(70);tvState = (TextView) headView.findViewById(R.id.tv_listview_header_state);tvLastUpdateTime = (TextView) headView.findViewById(R.id.tv_listview_header_last_update_time);mProgressBar = (ProgressBar) headView.findViewById(R.id.pb_listview_header_arrow);headView.measure(0, 0);//测量头布局的宽和高headerViewHeight = headView.getMeasuredHeight();//布局的高度155Log.i(TAG,"头布局的高度:"+headerViewHeight);headView.setPadding(0,-headerViewHeight,0,0);addHeaderView(headView);initAnimation();}
用到的listview_header.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dip" > <ImageView android:id="@+id/iv_listview_header_arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/common_listview_headview_red_arrow" /> <ProgressBar android:id="@+id/pb_listview_header_arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:visibility="gone" android:indeterminateDrawable="@drawable/custom_prograssbar"/> </FrameLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center_horizontal" android:orientation="vertical" > <TextView android:id="@+id/tv_listview_header_state" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下來刷新" android:textColor="#FF0000" android:textSize="18sp" /> <TextView android:id="@+id/tv_listview_header_last_update_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="最后刷新时间:1990-09-09 09:09:09" android:textColor="@android:color/darker_gray" android:textSize="14sp" /> </LinearLayout></LinearLayout>
接下来我们要理解下拉的逻辑:
1)首先我们需要隐藏listView的头
2)实现public boolean onTouchEvent(MotionEvent ev) {
@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN://下拉事件downY = (int)ev.getY();break;case MotionEvent.ACTION_MOVE:int moveY=(int) ev.getY();//移动中Y轴的偏移量//Log.i(TAG, "移動:"+moveY);//Log.i(TAG,"下移動:"+downY);int diffY=moveY-downY/3;//Log.i(TAG,"diffY:"+diffY);int paddingTop=-headerViewHeight+diffY;if(mfirstVisibleItem==0 && paddingTop>-headerViewHeight){//當前是在顶部if(paddingTop>0&¤tState==DOWN_REFRESH){//下拉刷新Log.i(TAG,"完全显示了,可以松开刷新了");currentState=RELEASE_REFRESH;//鬆開刷新refreshHeaderViewState();}else if(paddingTop<0&¤tState==RELEASE_REFRESH){//正在刷新中Log.i(TAG,"没有完全显示,当前是下拉刷新");currentState=DOWN_REFRESH;refreshHeaderViewState();}headView.setPadding(0,paddingTop, 0, 0);return true;}headView.setPadding(0,paddingTop, 0,0);break;case MotionEvent.ACTION_UP:if(currentState==DOWN_REFRESH){//下拉刷新抬起手指,需要把头布局隐藏headView.setPadding(0,-headerViewHeight, 0, 0);}else if(currentState==RELEASE_REFRESH){//释放刷新 ,显示正在刷新中的状态currentState=REFRESHING;//正在刷新中refreshHeaderViewState();//刷新头布局的状态/** * 去掉边距 */headView.setPadding(0, 0, 0, 0);if(mOnRefreshListener!=null){mOnRefreshListener.onDownRefresh();//刷新数据}//刷新完数据后 头隐藏}break;default:break;}return super.onTouchEvent(ev);}
3)计算滑动的距离,同时显示头
int paddingTop=-headerViewHeight+diffY;4)自定义动画修改箭头(两个箭头转动的动画)private void initAnimation() { upAnimation = new RotateAnimation(0, -180 , Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); upAnimation.setDuration(500); upAnimation.setFillAfter(true);//停留在动画结束时 downAnimation = new RotateAnimation(-180,-360 , Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); upAnimation.setDuration(500); upAnimation.setFillAfter(true);//停留在动画结束时 }5)开始编写回调函数(判断头是否全部显示,然后加载数据,加载数据的同时修改图片为sing)public interface OnRefreshListener {/** * 当下拉刷新时回调 */public void onDownRefresh();/** * 当加载更多时回调 */public void onLoadMoring();}主界面加载数据/** * 异步加载数据 */@Overridepublic void onLoadMoring() {//异步去抓取数据new AsyncTask<Void, Void, Void>(){@Overrideprotected Void doInBackground(Void... params) {SystemClock.sleep(2000);dataList.add("这是加载更多的数据1");dataList.add("这是加载更多的数据2");dataList.add("这是加载更多的数据3");return null;}@Overrideprotected void onPostExecute(Void result) {mAdapter.notifyDataSetChanged();mRefreshListView.hideFooterView();//隐藏脚布局super.onPostExecute(result);}}.execute(new Void[]{});}6)数据加载完毕,隐藏工作/** * 隐藏头布局 */public void hideHeaderView(){headView.setPadding(0, -headerViewHeight, 0, 0);mProgressBar.setVisibility(View.GONE);mProgressBar.clearAnimation();ivArrow.setVisibility(View.VISIBLE);tvState.setText("下来刷新");tvLastUpdateTime.setText("最后刷新时间:"+getLastUpdateTime());currentState=DOWN_REFRESH;}7)自定义监听/** * 设置刷新的监听事件 * 刷新完之后需要用hideHeaderView(),隐藏头buju * @param listener */public void setOnRefreshListener(OnRefreshListener listener){this.mOnRefreshListener=listener;}8)细节:/** * 当滚动状态改变时回调 * SCroll_state_idle 停止状态 * scroll_state_touch_scroll 触摸滚动(按住移动) * scroll_state_fing 滚动滑动 */@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if(scrollState==SCROLL_STATE_IDLE||scrollState==SCROLL_STATE_FLING){if(isScrollToBottom && !isLoadMoring){isLoadMoring=true;//加载更多中Log.i(TAG,"滑動到底部");footerView.setPadding(0, 0, 0, 0);//显示脚布局//滚动到底部,使用脚布局显示this.setSelection(this.getCount());//调用注册监听事件if(mOnRefreshListener!=null){mOnRefreshListener.onLoadMoring();}}}}/** * 当ListView滚动时回调方法 * * @param firstVisibleItem * 当前屏幕第一个可见的item的索引 * @param visibleItemCount * 当前屏幕显示了多少个item的数量 * @param totalItemCount * listView的总长度 */@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {mfirstVisibleItem = firstVisibleItem;if ((firstVisibleItem + visibleItemCount) == (totalItemCount)) {// 判断是否滚动到底部//Log.i(TAG, "滚动到底部,滚动到底部,滚动到底部,滚动到底部");isScrollToBottom = true;} else {isScrollToBottom = false;}}源代码下载:http://download.csdn.net/detail/javamov/6948855
0 0
- Android菜鸟之listview下拉刷新
- Android之listview下拉刷新
- android之Listview的下拉刷新实现
- Android控件ListView下拉刷新之SwipeRefreshLayout
- android学习之ListView下拉刷新
- Android之ListView实现下拉刷新
- Android ListView下拉刷新
- android Listview下拉刷新
- Android ListView下拉刷新
- Android-ListView 下拉刷新
- android listview下拉刷新!
- android listview下拉刷新
- Android ListView下拉刷新
- Android ListView 下拉刷新
- Android ListView下拉刷新
- android ListView下拉刷新
- android之listview滑动与下拉刷新冲突 : listview未到顶部便出现下拉刷新
- Android下拉/上拉刷新ListView之Android-PullToRefresh
- Arndale Octa 5420网络设置
- 菜鸟学SSH(十)——Hibernate核心接口
- 并查集路径压缩
- uboot工具
- C语言
- Android菜鸟之listview下拉刷新
- usaco 2002 月赛 Chores 题解
- xml参数化、自动化单元测试设计
- java项目开发实践经验每日总结(2014/2/22)
- 计算机组成原理复习大纲
- 常用Maven插件介绍
- c++学习笔记(19.动态类型识别)
- USACO 1.5 Checker Challenge (checker)
- htop的VIRT是什么