




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实现下拉刷新该准备的东西都已经准备好了。在这篇文章里,我们就开始实现下拉刷新功能吧。一、大体的逻辑分析我们来简单分析一下需要做的逻辑吧。首先分析头布局有几种状态。不下拉时,为正常状态,此时头布局隐藏。下拉到一定高度,提示信息变为“下拉刷新”,箭头朝下,此为下拉状态。再往下拉,提示信息变为“松开刷新”,箭头朝上,此为提示刷新状态。而此时松开手指,则执行刷新操作,头布局变为进度条显示,箭头消失,此为正在刷新状态。相反的,其他状态下松开手指,都不执行刷新操作,应该将头布局恢复到正常状态。因为可确定头布局的状态有四种。我们根据这四种状态,确定我们要做的事情。要监听ListView的滚动,故要实现OnScrollListener接口。还要监听手指触摸事件,根据手指的下拉移动来改变头布局的显示效果,根据手指的抬起来判断是否进行刷新操作,因为要实现onTouchEvent方法。也就是说,头布局状态的改变应该随着手指的移动而改变,因此在onTouchEvent里面我们要实现上面分析的四种状态的改变。当然,状态改变就意味着头布局显示效果的改变,这里可以嵌套在onTouchEvent方法里面。但考虑到避免方法臃肿,以及其他地方可能也需要改变头布局界面,比如数据加载完成后等情况,因此专门将头布局界面的改变抽取出来,凝聚为一个方法。然后就是数据刷新,刷新操作要在MyListView里执行,但是数据要在MainActivity中获取。老规矩,用接口回调即可。好了,基本上大体的逻辑就这么多了。下面我们将上面的分析转化为代码。二、代码编写废话我就不多说了,上面的分析很清楚了。继续完善MyListView即可。代码如下:package com.fuly.load;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ImageView;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;public class MyListView extends ListView implements OnScrollListenerprivate View header;/头布局private int headerHeight;/头布局自身的高度private int scrollState;/当前滚动状态private int firstVisibleItem;/当前可见的第一个itemprivate int startY;/刚开始触摸屏幕时的Y值private int curState = 0;/当前header状态,默认为0private final int NORMAL = 0;/正常状态private final int PULL = 1;/状态下拉private final int RELEASE = 2;/提示刷新状态private final int RELEASING = 3;/状态正在刷新private boolean canPull = false;/是否可以执行下拉操作private refresfListener mListener;/回调接口/三个构造方法都要重写public MyListView(Context context) super(context);initView( context);public MyListView(Context context, AttributeSet attrs) super(context, attrs);initView( context);public MyListView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle);initView( context);/定义回调接口public interface refresfListenervoid refresh();public void setOnRefreshListener(refresfListener listener)this.mListener = listener;public void initView(Context context)header = LayoutInflater.from(context).inflate(R.layout.header, null);notifyView(header);headerHeight = header.getMeasuredHeight();/获取header的高度/headerHeight = header.getHeight();paddingTop(-headerHeight);/将头布局加进去this.addHeaderView(header);this.setOnScrollListener(this);/* * 该方法为通知父布局,子布局view的宽度和高度 * param view:子布局 */private void notifyView(View view)ViewGroup.LayoutParams p = view.getLayoutParams();if(p = null)p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);/spec表示当前子view左右边距,padding表示子view的左右内边距/childDimension:子view的宽度int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);int height;int tempHeight = p.height;if(tempHeight0)/子布局高度不为空,需要填充这个布局height = MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY);else/高度为0,则不需要填充height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);/然后告诉父布局,子布局的高度和宽度view.measure(width, height);/该方法设定header的paddingTopprivate void paddingTop(int pt)header.setPadding(header.getPaddingLeft(), pt, header.getPaddingRight(), header.getPaddingBottom(); header.invalidate();/* * 监听当前滚动状态 * scrollState:当前滚动状态 */public void onScrollStateChanged(AbsListView view, int scrollState) /记录当前的滚动状态this.scrollState = scrollState;/* * 监听当前滚动的item * firstVisibleItem:当前可见的第一个item * visibleItemCount:当前共有多少个item可见 * totalItemCount:总共有多少个item * */public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) this.firstVisibleItem = firstVisibleItem;/触屏事件public boolean onTouchEvent(MotionEvent ev) switch(ev.getAction() /手指落到屏幕上时case MotionEvent.ACTION_DOWN:/如果当前可见的第一个item为第0号,说明ListView位于顶端,可以执行下拉刷新if(firstVisibleItem = 0)canPull = true;startY = (int) ev.getY();break;/手指在屏幕上拖动时case MotionEvent.ACTION_MOVE:if(canPull)touchMove(ev);break;/手指离开屏幕时case MotionEvent.ACTION_UP:canPull = false;if(curState = RELEASE)curState = RELEASING;refreshHeaderByState();/这里添加刷新数据的逻辑mListener.refresh();elsecurState = NORMAL;refreshHeaderByState();paddingTop(-headerHeight);break;return super.onTouchEvent(ev);/* * 该方法根据触摸屏幕滑动来改变STATE,即改变当前状态 * param ev */private void touchMove(MotionEvent ev) int tempY = (int) ev.getY();int space = tempY -startY;/移动的距离int topdding = space-headerHeight;paddingTop(topdding);/即时设定头布局的隐藏高度if(spaceheaderHeight&spaceheaderHeight+50)curState = RELEASE;/设定为提示刷新状态 refreshHeaderByState();if(spaceheaderHeight)curState = NORMAL;/设定为正常状态 refreshHeaderByState();/* * 根据当前状态更改header的显示界面 * */private void refreshHeaderByState( )ProgressBar pb = (ProgressBar) header.findViewById(R.gress_bar);ImageView img = (ImageView) header.findViewById(R.id.img_arrow);TextView tv = (TextView) header.findViewById(R.id.textinfo);switch(curState)case NORMAL:pb.setVisibility(View.GONE);img.setVisibility(View.VISIBLE);img.setImageResource(R.drawable.down_arrow);tv.setText(下拉刷新);break;case PULL:pb.setVisibility(View.GONE);img.setVisibility(View.VISIBLE);img.setImageResource(R.drawable.down_arrow);tv.setText(下拉刷新);break;case RELEASE:pb.setVisibility(View.GONE);img.setVisibility(View.VISIBLE);img.setImageResource(R.drawable.up_arrow);tv.setText(松开刷新);break;case RELEASING:pb.setVisibility(View.VISIBLE);img.setVisibility(View.GONE);tv.setText(正在刷新);break;/数据刷新完成后的操作public void refreshFinish()curState = NORMAL;paddingTop(-headerHeight);refreshHeaderByState();接下来就是MainActivity中的代码了。如下:package com.fuly.load;import java.util.ArrayList;import java.util.List;import com.fuly.load.MyListView.refresfListener;import android.os.Bundle;import android.os.Handler;import android.app.Activity;public class MainActivity extends Activity implements refresfListenerprivate MyListView lv;private List mDatas = new ArrayList();private MyAdapter mAdapter; protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData();/该方法初始化数据 lv = (MyListView) findViewById(R.id.list_view); lv.setOnRefreshListener(this
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年城市网络安全设备采购合同
- 2025广东惠州市博罗县工交实业投资有限公司管理岗位遴选2人模拟试卷及答案详解(夺冠系列)
- 2025年新乡延津县选调县外在编在岗教师回乡任教的考前自测高频考点模拟试题及答案详解(名校卷)
- 苏州人文考试题库及答案
- 化妆师升职考试题库及答案
- 监控设备安装合同协议书范本7篇
- 河北历史学考试试题及答案
- 2025年新疆甜菜种植与种植户种植补贴合同
- 2025年贵州省安顺市辅警人员招聘考试题库及答案
- 工业司炉实操考试试题及答案
- Unit 3 She has long hair. (教学设计)-2024-2025学年湘鲁版英语五年级上册
- 部编版初中语文书下注释(全六册)
- 职业学校“十四五”发展规划
- 油漆作业风险和隐患辨识、评估分级与控制措施一览表
- 高血压知识水平量表
- 手术室缩短接台时间
- 海南省2023年中考历史试题(含答案)
- 车载测试行业分析
- 开放性颅骨骨折
- 制作污水处理设备合同
- 微商新手培训课件
评论
0/150
提交评论