背景

最近在公司的项目中要使用到ListView的下拉刷新和上拉加载更多(貌似现在是个项目就有这个功能!哈哈),其实这个东西GitHub上很多,但是我感觉那些框架太大,而且我这个项目只用到了ListView没有用到其他的,所以我就想自己写一个吧!
(注:本篇文章高手就自动略过吧!!!!)

一.实现步骤

  1. 自定义View继承ListView
  2. 向ListView添加头部View和尾部View(还有人不知道吗?哈哈)
  3. 隐藏头部View和尾部View (这个地方有个坑,我在代码介绍的时候会注明)
  4. 重写onTouchEvent()方法 (这个地方注意点很多 要不然运行的时候 会出现很多细节上的问题)

二.代码实现

终于到了写代码的时候啦!!我们按照上面的步骤一步一步的来

1.自定义View继承ListView 同时也要继承 AbsListView.OnScrollListener 因为要我们要记录ListView的状态.上代码:

2.向ListView添加头部View和尾部View 这里如果直接调用view的getMeasuredHeight()方法来获取view的高度的话,你就会发这个这个高度值为0,所以我们在调用之前应该先执行下面段代码:

得到view高度之后 就可以获取到头部View和尾部view的高度啦!在看代码:

3.隐藏头部View和尾部View 这一步在第二部的代码片段中已经实现啦!就是设置两个View的paddingTop值 注意是负的啊 要不然不能隐藏哦!

4.重写onTouchEvent()方法 重头戏来啦!

1.首先我们再来分析一下 下拉刷新的过程:

(1).用户没有任何操作

(2).用户在在下拉

(3).下拉一定距离 提示用户松开刷新

(4).正在刷新

(5).刷新完成-->(1)

至此我们知道了总共用四中状态!我们可以用四个静态常亮来表示。当然,我们也因该定义个变量表示当前的状态 默认当然是无状态啦!!!看代码:

  1. 分析完状态之后,我们还需注意几点小问题:就是我们在什么时候才能下拉刷新呢?(大家好好想想!!) 就是当前页面中出现我们ites中的第一个(就是ListView显示列表中的第一个),此时下来才是有效的!!那怎么才知道当前页面中的第一个是ListView列表中的第一个呢?其实很简单 在继承ListView的时候我们继承了AbsListView.OnScrollListener这个回调接口!该接口有两个!我们先看其中一个回调方法

代码中注释很清楚 我就不说明了!!

3.至此,我们就要开始写最核心的部分了(请大家睁大双眼)
(1).首先我们的第一步操作就是按下屏幕 此时当然触发Acion_Down啦。此时就是我们判断当前页面的第一个是否是ListView列表中的第一个啦 如果是的 我们设置个标志位记录下。同时呢 我们也得记录下按下去的X Y值。看代码


(2).下面就是开始向下滑动了 这里我直接上代码(有注释 不要担心看不懂。如果看不懂就多看几遍!!哈哈)
代码略长分了两段上传:


仔细的看的人可以能要问了。这两个函数setHeaderViewTopPadding()和updateHeadView()是什么鬼!其实看名字就知道啦!第一个是用来更新view的paddingtop值的!第二个是用来更新View的内容的!
4.最后一步啦 当用户松开手指的时候:其实很好判断 :无非就是判断当前状态是什么 如果是 PULLTOREALSE 松开就是刷新 不是的话就恢复出事状态。看代码:

至此 本篇博客就要结束啦!可以有人要说了你骗人 !还有上拉加载更多呢?其实这个比下拉刷新简单的太多了!我就不贴代码了!!!大家自己去摸索吧!!
附上代码下载链接

代码

android ListView下拉刷新 上拉加载更多的更多相关文章

  1. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  2. SwipeRefreshLayout实现下拉刷新上滑加载

    1. 效果图 2.RefreshLayout.java package myapplication.com.myapplication; import android.content.Context; ...

  3. Android 下拉刷新上啦加载SmartRefreshLayout + RecyclerView

    在弄android刷新的时候,可算是耗费了一番功夫,最后发觉有现成的控件,并且非常好用,这里记录一下. 原文是 https://blog.csdn.net/huangxin112/article/de ...

  4. juery下拉刷新,div加载更多元素并添加点击事件(二)

    buffer.append("<div class='col-xs-3 "+companyId+"' style='padding-left: 10px; padd ...

  5. Android如何定制一个下拉刷新,上滑加载更多的容器

    前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉 ...

  6. 移动端下拉刷新上拉加载-mescroll.js插件

    最近无意间看到有这么一个上拉刷新下拉加载的插件 -- mescroll.js,个人感觉挺好用的,官网地址是:http://www.mescroll.com 然后我就看了一下文档,简单的写了一个小dem ...

  7. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多

    ListView实现Item上下拖动交换位置  并且实现下拉刷新  上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...

  8. ListView下拉刷新上拉加载更多实现

    这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...

  9. listview下拉刷新上拉加载扩展(二)-仿美团外卖

    经过前几篇的listview下拉刷新上拉加载讲解,相信你对其实现机制有了一个深刻的认识了吧,那么这篇文章我们来实现一个高级的listview下拉刷新上拉加载-仿新版美团外卖的袋鼠动画: 项目结构: 是 ...

  10. MaterialRefreshLayout+ListView 下拉刷新 上拉加载

    效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行. 下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种 ...

随机推荐

  1. 整合spring roo,maven,mybatis,spring-flex,blazeds,mysql

    1.      下载spring roo,设置环境变量ROO_HOME,和path,classpath. 使用CMD命令行找到工作区间,新建工程目录转到工程目录:mkdir ten-minutes $ ...

  2. 大话设计模式C++实现-第22章-桥接模式

    一.UML图 二.概念 桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化. 三.说明 为什么叫"桥接模式"? 如上所看到的的UML图中,有一个聚合线, ...

  3. Eclipse中R文件不能自动生成

       R文件不能自动生成主要是因为编译有错误,这时你想什么办法都是没有用的,clean, fix properties,都不是从根上解决问题.    R文件主要是自动生成资源文件的id的,里边静态子类 ...

  4. iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)

    Swift 懒加载(lazy) 在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都 ...

  5. android UI设计时须要注意遵循的设计原则

    1.Android设备屏幕尺寸分布 首先看一下各种屏幕的尺寸和屏幕密度划分,下图是各种屏幕尺寸相应的范围: 从上图能够看出.相应normal尺寸的屏幕范围集中在常见的3到5寸屏之间.large尺寸相应 ...

  6. mysql 参数read_rnd_buffer_size的真正含义

     http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html  http://dev.mysql.com/doc/refman/ ...

  7. 表ADT

    表一般不用简单数组来实现,通常将其实现为链表.在链表中要不要使用表头则属于个人兴趣问题.在下面的例程中我们都使用表头. 按照C的约定,作为类型的List(表)和Position(位置)以及函数的原型都 ...

  8. 基于jQuery右侧带缩略图导航的焦点图

    今天我们要来分享一款右侧带缩略图导航的jQuery焦点图插件,这款jQuery焦点图插件的特点是右侧有一列缩略图导航列表,并且可以定义任意数量的图片,你可以拖动列表来查看所有的图片,点击缩略图后,即可 ...

  9. eclipse中的tomcat debug模式启动报超时45s

    在eclipse中加入tomcat,开debug模式非常好用,这里就不介绍了 最近eclipse的tomcat开debug模式就是启动不了,增加时间也不能解决,但是非debug模式就可以打开,我觉得是 ...

  10. LeetCode44 Wildcard Matching

    题目: Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single charact ...