计步器(Pedometer)整个项目的源代码,最近做了比较大的修改,可能以前下载的不能运行,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~)

https://github.com/296777513/pedometer

今天实现实现的下拉刷新的功能,先上几张效果图:

如图所示,今天就是要实现的这个效果

首先,分析ListView下拉刷新实现方式

1、需要添加顶部下拉加载页面

2、需要监听onScrollListener来判断当前是否显示在listview的最顶部

3、因为顶部下拉加载界面是跟随手势滑动状态不断改变界面显示的所以我们需要监听onTouch事件,来改变当前状态以及界面显示;

4、根据当前状态加载数据

一下是ReFlashListView下拉刷新类的代码

package com.example.listviewfreshdemo1;import java.text.SimpleDateFormat;
import java.util.Date;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.RotateAnimation;
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 ReFlashListView extends ListView implements OnScrollListener {private View header;// 顶部布局文件;int headerHeight;// 顶部布局文件的高度;int firstVisibleItem;// 当前第一个可见的item的位置;int scrollState;// listview 当前滚动状态;boolean isRemark;// 标记,当前是在listview最顶端摁下的;int startY;// 摁下时的Y值;int state;// 当前的状态;final int NONE = 0;// 正常状态;final int PULL = 1;// 提示下拉状态;final int RELESE = 2;// 提示释放状态;final int REFLASHING = 3;// 刷新状态;private IReflashListener iReflashListener;// 刷新数据的接口public ReFlashListView(Context context) {super(context);// TODO Auto-generated constructor stubinitView(context);}public ReFlashListView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinitView(context);}public ReFlashListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stubinitView(context);}/*** 初始化界面,添加顶部布局文件到 listview* * @param context*/private void initView(Context context) {LayoutInflater inflater = LayoutInflater.from(context);header = inflater.inflate(R.layout.header, null);//加载顶部布局文件measureView(header);headerHeight = header.getMeasuredHeight();Log.i("tag", "headerHeight = " + headerHeight);topPadding(-headerHeight);this.addHeaderView(header);this.setOnScrollListener(this);}/*** 通知父布局,占用的宽,高;* * @param view*/private void measureView(View view) {ViewGroup.LayoutParams p = view.getLayoutParams();if (p == null) {p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);}int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);int height;int tempHeight = p.height;if (tempHeight > 0) {height = MeasureSpec.makeMeasureSpec(tempHeight,MeasureSpec.EXACTLY);} else {height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);}view.measure(width, height);}/*** 设置header 布局 上边距;* * @param topPadding*/private void topPadding(int topPadding) {header.setPadding(header.getPaddingLeft(), topPadding,header.getPaddingRight(), header.getPaddingBottom());header.invalidate();}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {this.firstVisibleItem = firstVisibleItem;}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {this.scrollState = scrollState;}@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubswitch (ev.getAction()) {case MotionEvent.ACTION_DOWN:if (firstVisibleItem == 0) {isRemark = true;startY = (int) ev.getY();}break;case MotionEvent.ACTION_MOVE:onMove(ev);break;case MotionEvent.ACTION_UP:if (state == RELESE) {state = REFLASHING;// 加载最新数据;reflashViewByState();iReflashListener.onReflash();} else if (state == PULL) {state = NONE;isRemark = false;reflashViewByState();}break;}return super.onTouchEvent(ev);}/*** 判断移动过程操作;* * @param ev*/private void onMove(MotionEvent ev) {if (!isRemark) {return;}int tempY = (int) ev.getY();int space = tempY - startY;int topPadding = space - headerHeight;switch (state) {case NONE:if (space > 0) {state = PULL;reflashViewByState();}break;case PULL:topPadding(topPadding);if (space > headerHeight + 30&& scrollState == SCROLL_STATE_TOUCH_SCROLL) {state = RELESE;reflashViewByState();}break;case RELESE:topPadding(topPadding);if (space < headerHeight + 30) {state = PULL;reflashViewByState();} else if (space <= 0) {state = NONE;isRemark = false;reflashViewByState();}break;}}/*** 根据当前状态,改变界面显示;*/private void reflashViewByState() {TextView tip = (TextView) header.findViewById(R.id.tip);ImageView arrow = (ImageView) header.findViewById(R.id.arrow);ProgressBar progress = (ProgressBar) header.findViewById(R.id.progress);RotateAnimation anim = new RotateAnimation(0, 180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);anim.setDuration(500);anim.setFillAfter(true);RotateAnimation anim1 = new RotateAnimation(180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);anim1.setDuration(500);anim1.setFillAfter(true);switch (state) {case NONE:arrow.clearAnimation();topPadding(-headerHeight);break;case PULL:arrow.setVisibility(View.VISIBLE);progress.setVisibility(View.GONE);tip.setText("下拉可以刷新!");arrow.clearAnimation();arrow.setAnimation(anim1);break;case RELESE:arrow.setVisibility(View.VISIBLE);progress.setVisibility(View.GONE);tip.setText("松开可以刷新!");arrow.clearAnimation();arrow.setAnimation(anim);break;case REFLASHING:topPadding(50);arrow.setVisibility(View.GONE);progress.setVisibility(View.VISIBLE);tip.setText("正在刷新...");arrow.clearAnimation();break;}}/*** 获取完数据;*/public void reflashComplete() {state = NONE;isRemark = false;reflashViewByState();TextView lastupdatetime = (TextView) header.findViewById(R.id.freshTime);SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");Date date = new Date(System.currentTimeMillis());String time = format.format(date);lastupdatetime.setText(time);}public void setInterface(IReflashListener iReflashListener) {this.iReflashListener = iReflashListener;}/*** 刷新数据接口* * @author Administrator*/public interface IReflashListener {public void onReflash();}
}

实现刷新页面的测试类代码

package com.example.listviewfreshdemo1;import java.util.ArrayList;
import java.util.List;
import com.example.listviewfreshdemo1.ReFlashListView.IReflashListener;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class FragmentPK_1 extends Fragment implements IReflashListener {private View view;private ReFlashListView myListView;private MyAdapter myAdapter;private List<User> users;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {view = inflater.inflate(R.layout.pk_1, container, false);setData();showList();return view;}/*** 通知界面显示*/private void showList() {if (myAdapter == null) {myListView = (ReFlashListView) view.findViewById(R.id.flashView);myAdapter = new MyAdapter(getActivity(), users, myListView);myListView.setAdapter(myAdapter);myListView.setInterface(this);} else {myAdapter.DataChanged(users);}}/*** 设置数据*/private void setData() {users = new ArrayList<User>();for (int i = 0; i < 10; i++) {User user = new User();user.setName("old big: " + i);user.setInfo("坑爹:" + i);users.add(user);}}/*** 设置刷新后的数据*/private void setReflashData() {for (int i = 0; i < 2; i++) {User user = new User();user.setName("这是重生的old big: " + i);user.setInfo("继续坑爹:" + i);users.add(0, user);}}@Overridepublic void onReflash() {Handler handler = new Handler();handler.postDelayed(new Runnable() {@Overridepublic void run() {//获取最新数据setReflashData();//通知界面显示showList();//通知listview 刷新数据完毕;myListView.reflashComplete();}}, 2000);}}

这个例子的demo下载页面(0分下载,并且增加指示器随页面变化而改变)

http://download.csdn.net/detail/a296777513/8346699

基于Android的计步器(Pedometer)的讲解(六)——ListView下拉刷新页面相关推荐

  1. 基于android的计步器文档,基于Android的计步器(Pedometer)的讲解(六)

    计步器(Pedometer)整个项目的源代码,最近做了比较大的修改,可能以前下载的不能运行,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~) https://github.com/296 ...

  2. 基于Android的计步器(Pedometer)的讲解-序

    这两个月学校的课程任务太重,又是考试,又是大作业,实在是没时间写博客,正好元旦放假,有时间就把最近做的计步器项目给大家详细讲解一番.这个讲解估计要分很多篇来讲述. 这个项目(Pedometer)已经上 ...

  3. 基于Android的计步器(Pedometer)的讲解(四)——后台记步

    今天先不说Pedometer(计步器)项目UI方面的了,今天讲一个基于重力加速度的记步功能传感器(Sensor),然后 在后台开启记步. 计步器(Pedometer)整个项目的源代码,感兴趣的朋友可以 ...

  4. 基于Android的计步器(Pedometer)的讲解(二)——柱状图分析2

    早上第二大节有课,所以没有来得及仔细看这个例子,中午回来将这个例子写完了,现在柱状图有两个实现的方式了,一个是之前博客提到的,一个就是现在这个. 这个柱状图也实现了动态的增长,和点击显示相应柱状图的数 ...

  5. android-ultra-pull-to-refresh list,[Android]Ultra-Pull-To-Refresh之listview下拉刷新、上拉加载的用例...

    前言 app中最常见的场景莫过于下拉刷新和自动加载的功能了,最经典的开源组件就是 本次demo的编辑环境为android studio,java1.8 截图 使用 1.本示例依赖jar如下: depe ...

  6. Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout

    SwipeRefreshLayout 下拉刷新布局SwipeRefreshLayout是Android又一与时俱进的控件,顾名思义它随着用户手势向下滑动就会触发刷新操作.从实际的下拉效果来看,Swip ...

  7. android中上拉下滑布局,3年以上勿进!最简单的Android自定义ListView下拉刷新与上拉加载,代码直接拿去用~...

    本文主要针对开发新手,手写实现一个最简单Android自定义listview下拉刷新和上拉加载demo. 不喜可喷,欢迎大佬留言指点. 效果图 一:编写需要在ListView中增加头加载的布局文件,与 ...

  8. Android 天气APP(十)继续优化、下拉刷新页面天气数据

    上一篇:Android 天气APP(九)细节优化.必应每日一图 修复每日一图,增加下拉刷新,滑动改变标题 新版------------------- 一.修复每日请求必应壁纸Bug 二.增加下拉刷新 ...

  9. android代码下拉刷新页面,Android下拉刷新的实现

    ListView下拉刷新实现方式分析 1.添加顶部下拉加载界面. 2.监听onScrollListener,来判断当前是否在ListView最顶部. 3.监听onTouch事件,根据手势变化改变当前状 ...

最新文章

  1. Pandas.DataFrame删除指定行和列(drop)
  2. Linux多线程实践(一)线程基本概念和理论
  3. python如何输入数字赋值_三、python语法(定义,赋值,注释,输入输出)
  4. Java Web HelloWorld!
  5. INTERSPEECH 2020 AutoSpeech论文征集挑战赛正式启动
  6. Redis 的应用场景
  7. C# 并行运算方法简析
  8. CRegKey 注册表操作
  9. 大学mysql期末试题_四川大学数据库系统期末试题2014-2015.doc
  10. linux ucontext族函数的原理及使用
  11. mysql多实例和主从区别_mysql多实例的安装以及主从复制配置
  12. jquery选择器之过滤选择器
  13. Google 编程之夏:海量优质项目,丰厚报酬,你竟然还不知道?
  14. javaweb项目tomcat检查不到当前模型的解决方法
  15. grub4dos修改/制作message背景文件
  16. sencha app watch php,Sencha Cmd使用指南
  17. 借助HttpCombiner让你的网站加速
  18. HSSFWorkbook EXCEL导出
  19. html 自动填充缓存,禁止input密码自动填充及浏览器缓存密码账号解决方案
  20. python对mysql增删改查+计算器+九九乘法表

热门文章

  1. 相对路径和绝对路径 区别
  2. Vue Element table表格实现表格数据动态滚动(无限滚动)
  3. 如何打造一个成功的MES系统,我们又需要注意些什么?
  4. 诛仙哪里炼器服务器最稳定,诛仙手游炼器方法 低成本稳定全身+11炼器攻略
  5. 恶意NPM包窃取Discord 令牌和信用卡信息等
  6. Linux系统搭建Nginx+Tomcat集群部署
  7. 【小程序开发必备】微信小程序常用API全介绍,附示例代码和使用场景
  8. 高通8996启动流程-4. lk启动之boot_linux_from_mmc
  9. 请求转发和重定向概念
  10. http://jingyan.baidu.com/article/7908e85c74d85faf491ad260.html