关于下拉刷新/上拉载入很多其它的解决方式网上已经有非常多了,浏览了眼下主流的下拉控件比方PullToRefresh库等。第一:大多数实现库都难以进行动画和样式的自己定义。

第二:不能非常好的兼容多种滚动控件,它们都对listView、RecyclerView等进行了不同程度的又一次实现,你在项目中就得使用库提供的PullToRefreshListView、PullToRefreshRecyclerView等来取代源生的listView、RecyclerView等。这种方式事实上并不好,随着android版本号的不断升级源生的listView、RecyclerView也不断加入新特性和对之前bug的改动,这使得三方实现的控件非常难跟上google的节奏,当源生listView已经更新多个版本号之后,三方的ListView可能还在使用低版本号的实现方式。

基于如上两个原因。我開始着手开发SpringView(弹性View)

SpringView有哪些长处?

  1. 能对header/footer(头部/尾部)的样式和动画进行高度自己定义,单独将header/footer独立出来。差点儿能够实现不论什么你想要的效果,仅仅须要继承BaseHeader/BaseFooter实现相应接口就能够。

  2. 能动态地替换header/footer。仅仅须要设置不同的头尾就可以:springView.setHeader(MyHeader());

  3. 在不重写源生控件的情况下。完美支持系统源生的listView、RecyclerView、ScrollView、WebView等,你依旧使用google提供的官方控件,SpringView全然不做干涩。

  4. 使用简单。对于简单的需求甚至不用写不论什么代码。仅仅须要在布局中为SpringView设置header=”@layout/…”属性就可以。

  5. SpringView是非常轻量级的实现。提供了非常easy拓展的对外接口

  6. SpringView支持多点触控,能够两仅仅手连续拖拽。你能够定制一些趣味的动画(比如demo5的仿acfun效果)

  7. SpringView提供了2种拖拽方式(重叠和尾随)。能够动态地切换

  8. SpringView为不想去自己定义头/尾的懒人提供了7种默认的实现(模仿了阿里。腾讯,美团等多种风格)例如以下。还会继续添加

怎样使用 SpringView?

源代码及demo下载 gitbub: 下载地址

在布局文件里加入SpringView,并把你想要拖拽的控件放在SpringView中,给SpringView加入app:header=”@layout/…”属性。设置一个自己编写的头部的布局就可以(footer同理):

    <com.liaoinstan.springview.widget.SpringView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:header="@layout/myheader"
app:footer="@layout/myfooter"> <listView
android:layout_width="match_parent"
android:layout_height="match_parent"/> </com.liaoinstan.springview.widget.SpringView>

这样,最主要的实现就完毕了,执行看看吧。

当然,你也能够不再布局中设置,使用代码动态加入:

    //DefaultHeader/Footer是SpringView已经实现的默认头/尾之中的一个
//很多其它还有MeituanHeader、AliHeader、RotationHeader等如上图7种
springView.setHeader(new DefaultHeader(this));
springView.setFooter(new DefaultFooter(this));

刷新和载入很多其它的事件处理

假设须要处理的话,仅仅需在代码中加入监听:

springView.setListener(new SpringView.OnFreshListener() {
@Override
public void onRefresh() {
}
@Override
public void onLoadmore() {
}
});

怎样自己定义一个Header或Footer

具体的你能够看下几种默认实现的Header源代码,这里仅仅简介下:

我们要做一个简单的能够记录拖拽了多少次的Header。

首先新建一个自己定义头部布局。就是在RelativeLayout中放一个TextView啦:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@drawable/view_post_comment_bg"
android:layout_gravity="top"> <TextView
android:layout_width="120dp"
android:gravity="center"
android:layout_height="wrap_content"
android:text="this is TextView "
android:background="#ff0000"
android:textColor="#ffffff"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/textView" />
</RelativeLayout>

接着,新建一个MyHeader基础自BaseHeader:

public class MyHeader extends BaseHeader{
//获取Header
@Override
public View getView(LayoutInflater inflater, ViewGroup viewGroup) {} //拖拽開始前回调
@Override
public void onPreDrag(View rootView) {} //手指拖拽过程中不断回调。dy为拖拽的距离,能够依据拖动的距离加入拖动过程动画
@Override
public void onDropAnim(View rootView, int dy) {} //手指拖拽过程中每次经过临界点时回调。upORdown是向上经过还是向下经过
@Override
public void onLimitDes(View rootView, boolean upORdown) {} //拉动超过临界点后松开时回调
@Override
public void onStartAnim() {} //头部已经所有弹回时回调
@Override
public void onFinishAnim() {}
}

凝视已经非常清楚了。当中必须实现的方法是getView(),将头部的View实例返回给SpringView。其余方法有需求就实现。

实现getView()方法,加入一个成员变量保存头部中的TextView:

    private TextView textView;
@Override
public View getView(LayoutInflater inflater, ViewGroup viewGroup) {
View view = inflater.inflate(R.layout.header_my, viewGroup, true);
textView = (TextView)view.findViewById(R.id.textView);
return view;
}

实现onLimitDes方法。在每次经过临界点时改变TextView的内容:

    private int i = 0;
@Override
public void onLimitDes(View rootView, boolean upORdown) {
i++;
textView.setText("this is TextView "+i);
}

OK,在Activity中为SpringView设置我们自己定义的MyHeader就能够了。再设置一个监听器,在刷新和载入很多其它的时候等待1秒调用onFinishFreshAndLoad()结束刷新动作。

        springView = (SpringView) findViewById(R.id.springview);
springView.setHeader(new MyHeader()); springView.setListener(new SpringView.OnFreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
springView.onFinishFreshAndLoad();
}
}, 1000);
}
@Override
public void onLoadmore() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
springView.onFinishFreshAndLoad();
}
}, 1000);
}
});

这样就完毕了一个简单的自己定义Header,Footer同理。

怎样自己定义最大下拉高度,临界高度。和回弹高度

在BaseHeader(BaseFooter同理)中默认已经实现3个方法。分别返回的是临界高度(limit hight),下拉最大高度(max height)。下拉弹动高度(spring height):

假设有更加复杂的需求,须要更改这些高度的话。就在自己的Header中重写这些方法。凝视已经非常清楚了:

public abstract class BaseHeader implements SpringView.DragHander{
/**
* 这种方法用于设置当前View的临界高度(limit hight),即拉动到多少会被认定为刷新超作,而没到达该高度则不会执行刷新
* 返回值大于0才有效,假设<=0 则设置为默认header的高度
* 默认返回0
*/
@Override
public int getDragLimitHeight(View rootView) {
return 0;
} /**
* 这种方法用于设置下拉最大高度(max height),不管怎么拉动都不会超过这个高度
* 返回值大于0才有效,假设<=0 则默认600px
* 默认返回0
*/
@Override
public int getDragMaxHeight(View rootView) {
return 0;
} /**
* 这种方法用于设置下拉弹动高度(spring height),即弹动后停止状态的高度
* 返回值大于0才有效,假设<=0 则设置为默认header的高度
* 默认返回0
*/
@Override
public int getDragSpringHeight(View rootView) {
return 0;
}
}

到这里,SpringView的用法基本介绍完了,后面的文章会陆续从源代码介绍SpringView的实现,和自带的各种默认Header的实现

下载请移步gitbub:

我的github

认为不错的话。以下有个赞能够点一下:)

android开发游记:SpringView 下拉刷新的高效解决方式,定制你自己风格的拖拽页面的更多相关文章

  1. Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果

    前言 接着上一期Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件 的博客开始,同样,在开始前我们先来看一下目标效果: 下面上一下本章需要实现的效果图: 大家看到这个效果 ...

  2. Android学习之——ListView下拉刷新

    背景知识 ListView使用非常广泛,对于使用ListView的应用来说,下拉刷新是必不可少要实现的功能. 我们常用的微博.网易新闻,搜狐新闻都使用了这一功能,如下图所示.     微博 搜狐新闻 ...

  3. Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

    前言: 忙完了结婚乐APP的开发,终于可以花一定的时间放在博客上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下目标效果以及demo效果:      因为此效果实现的步骤 ...

  4. Android—自定义控件实现ListView下拉刷新

    这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的 ...

  5. android SwipeRefreshLayout google官方下拉刷新控件

    下拉刷新功能之前一直使用的是XlistView很方便我前面的博客有介绍 SwipeRefreshLayout是google官方推出的下拉刷新控件使用方法也比较简单 今天就来使用下SwipeRefres ...

  6. Android PullToRefresh (GridView 下拉刷新上拉加载)

    做这个需要自己去git hub上下载个pull-to-refresh 里面有个library为依赖包自己导到自己的项目中 (下载地址:https://github.com/chrisbanes/And ...

  7. Android 使用PullToRefresh实现下拉刷新和上拉加载(ExpandableListView)

    PullToRefresh是一套实现非常好的下拉刷新库,它支持: 1.ListView 2.ExpandableListView 3.GridView 4.WebView 等多种常用的需要刷新的Vie ...

  8. android 引用 project以及下拉刷新开源类库Android-PullToRefresh 的使用

    Android-PullToRefresh 是一个github上的开源下拉刷新类库, GitHub  .此外,该作者还有另外一个实用度和关注量极高的项目–另一种Android ActionBar的实现 ...

  9. Android 之WebView实现下拉刷新和其他相关刷新功能

    最近项目中需要用到WebView下拉刷新的功能,经过查找资料终于完成了此功能,现在拿出来和大家分享一下.希望对大家有所帮助. 效果如下图:   代码: activity.xml <?xml ve ...

随机推荐

  1. HDU 4320 Arcane Numbers 1 (数论)

    A - Arcane Numbers 1 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  2. bzoj 1433 二分图匹配

    裸地匈牙利或者最大流,直接匹配就行了 需要注意的是(我就没注意细节WA了好多次...) 每个人和自己之间的边是0,但是应该是1 不是在校生是没有床的.... /******************** ...

  3. onvif实现

    前言 负责开发了公司的onvif,一个人从0开始写的,花了两个月 !!!下面是我的总结. onvif介绍 ONVIF[Open Network Video Interface Forum](开放型网络 ...

  4. rtmp服务端实现

    前言 网上好像没一篇讲的很完善的,可能和公司保密有关吧.先就最让人困惑(至少我是这样)且网上也很少找到答案的一个点讲一下id各是什么意思? (如果我哪里理解错了,希望大神指出,毕竟我也是看了好多资料及 ...

  5. JSP(1) - JSP简介、原理、语法 - 小易Java笔记

    1.JSP简介 (1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet) (2)JSP.Servlet各自 ...

  6. Ubuntu系统进程管理笔记

    前言 今天对前端服务器进行迁移,本来前端服务器就一台,都是放置前端静态文件的地方,应该是比较简单的.唯一的问题是由于Nginx需要给ie8浏览器个i同https访问支持,不得不对Nginx进行重新编译 ...

  7. Tk写的发邮件小程序

    from tkinter import * import smtplib from email.mime.text import MIMEText from email.header import H ...

  8. selenium 下拉框处理

    web应用中有很多时候我们会遇见<select></select>标签的下列列表框,一般是无法直接去操作下列列表中的选择的.selenium webdriver 提供了专门操作 ...

  9. 在WINDOWS2008 Server 中创建NFS服务器,使用LINUX的MOUNT命令去加载网络盘

    1.在WINDOWS服务器中创建NFS SERVER 首先,打开服务管理器,选择添加角色:     选中文件服务,下一步:     出现一个提示,不管它,继续下一步:     在接下来的页面中选中“网 ...

  10. CSS3实现鼠标经过图片时图片放大

    在鼠标经过图片时,图片被放大,而且还有个过渡的效果.... <!DOCTYPE html> <html> <head> <link href="cs ...