Android下拉刷新控件PullToRefresh实例解析

  Android中很多时候都会用到上下拉刷新,这是一个很常用的功能,Android的v4包中也为我们提供了一种原生的下拉刷新控件--SwipeRefreshLayout,可以用它实现一个简洁的刷新效果,但今天我们的主角并不是它,而是一个很火的第三方的上下拉刷新控件--PullToRefresh。PullToRefresh包括PullToRefreshScrollView、PullToRefreshListView、PullToRefreshGridView等等很多为我们提供的控件,我们可以在xml文件中直接引入作为控件使用。

与一些其他的第三方库不同,PullToRefresh的使用需要我们引用一个module作为依赖:

之后进入我们的project的配置中心,快捷键是ctrl+alt+shift+s,然后选中你想要添加上下拉刷新的module,点击右上角的加号,选择Module dependency

然后一路点击"OK",等待一会就可以将这个类库附加到我们项目中了,我们就可以使用上下拉刷新了。

我们引入的第三方库的目录结构是这样的:

在xml文件中使用该控件的时候,注意要使用包名.类名的形式来引用你想要使用的控件,像这样:

com.handmark.pulltorefresh.library.PullToRefreshListView

包名可以在我们引入的库的module的AndroidManifest中查看,在目录中的java文件夹下的类就是我们要使用的类。这里我们以PullToRefreshListView为例,其他的控件的使用方法类似。非常恶心的是控件里面的属性没有代码提示...没有代码提示...没有代码提示!害的我对照了好几遍,以为自己倒错了module,结果是因为没有代码提示。
我们先来看几个比较重要的方法:

//获取带有刷新的对应控件
 pullToRefreshListView.getRefreshableView();
 /**
 * 设置刷新的模式:常用的有三种
 * PullToRefreshBase.Mode.BOTH //上下拉刷新都可以
 * PullToRefreshBase.Mode.PULL_FROM_START //只允许下拉刷新
 * PullToRefreshBase.Mode.PULL_FROM_END //只允许上拉刷新
 *
 */
 pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_END);
 //设置是否允许刷新的时候可以滑动
 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true);

当我们通过getRefreshableView()获得对应的带有刷新的控件(如使用PullToRefreshListView的时候,调用此方法会返回一个ListView实例)的时候会得到一个对应的控件,比如说ListView,则listItem的点击事件或者是数据适配我们就可以对这个获取到的ListView进行。

还有一个比较重要的方法就是为控件设置刷新时的监听: 
pullToRefreshListView.setOnRefreshListener()

他有两个参数可以传,一个是
PullToRefreshBase.OnRefreshListener<T>

接口对应的匿名内部类形式。一个是
PullToRefreshBase.OnRefreshListener2<T>

接口对应的匿名内部类形式。其中一般上下拉刷新同时可用的时候我们选择第二个形式:

pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
 //完成下拉刷新操作
 @Override
 public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {

 }

 //完成上拉刷新操作
 @Override
 public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {

 }
 });

当然,PullToRefresh还有一个重要方法就是 
pullToRefreshListView.onRefreshComplete();

此方法用来通知刷新完成了,取消刷新动画,如果不加这一句,会一直显示一个刷新动画。这里我们模拟一些数据,并且在下拉刷新的时候使用线程让程序睡2s,然后再随机加载一条新数据并通知Adapter更新UI,完成代码如下:

package ggcomic.rabbit.lx.pulltorefresh;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.handmark.pulltorefresh.library.LoadingLayoutProxy;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

 private PullToRefreshListView pullToRefreshListView;
 private ListView lv;
 private List<String> datas;
 private ArrayAdapter<String> adapter;
 private Handler handler=new Handler();
 private LoadingLayoutProxy llProxy;//设置刷新时的文本等的对象

 @Override

 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pull);

 datas=new ArrayList<>();
 for(int i=1;i<=50;i++){
 datas.add("item---------"+i);
 }

 //获取带有刷新的对应控件
 lv = pullToRefreshListView.getRefreshableView();
 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas);
 lv.setAdapter(adapter);
 /**
 * 设置刷新的模式:常用的有三种
 * PullToRefreshBase.Mode.BOTH //上下拉刷新都可以
 * PullToRefreshBase.Mode.PULL_FROM_START //只允许下拉刷新
 * PullToRefreshBase.Mode.PULL_FROM_END //只允许上拉刷新
 *
 */
 pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
 //设置是否允许刷新的时候可以滑动
 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true);

 pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
 //完成下拉刷新操作
 @Override
 public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
 new Thread(new Runnable() {
  @Override
  public void run() {
  try {
  //休眠2s
  Thread.sleep(2000);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }

  //向集合中添加一个随机数
  datas.add(0,"item-------"+(int)(Math.random()*100+1));
  handler.post(new Runnable() {
  @Override
  public void run() {
  adapter.notifyDataSetChanged();
  //控件刷新最新的数据
  pullToRefreshListView.onRefreshComplete();
  }
  });
  }
 }).start();
 }

 //完成上拉刷新操作
 @Override
 public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {

 }
 });

 }
}

效果图是这样的:

可以看到,刷新完成之后随机为我们添加了一个条目item--39。这样刷新就完成了,实际的项目中我们只需要在刷新的监听事件中完成我们的网络请求即可。

除了这些,我们还可以定义自己的刷新控件样式,如下我们首先定义一个全局变量LoadingLayoutProxy对象: 
private LoadingLayoutProxy llProxy;  //用于设置刷新控件刷新时的文本等的对象

在适当的位置实例化,并且设置相应的自定义的值:

layoutProxy = (LoadingLayoutProxy) pullToRefreshListView.getLoadingLayoutProxy(true, false);
 //下拉的时候显示的文本
 layoutProxy.setPullLabel("很好,继续向下拖!");
 //可以放开刷新的时候显示的文本
 layoutProxy.setReleaseLabel("放开那只萝莉,让我来!");
 //执行刷新的时候显示的文本
 layoutProxy.setRefreshingLabel("正在刷新喵~");
 //设置加载的图片
 layoutProxy.setLoadingDrawable(getResources().getDrawable(R.drawable.animatorss));

layoutProxy初始化时候的两个参数,分别表示应用于哪里,第一个参数表示是否应用于刷新头部,第二个参数表示是否应用于尾部。

我们还可以定义刷新时候的声音:

要使用音频文件的话需要先在res资源文件下新建一个raw文件夹,把音频文件放在这里,然后再代码中引用:

SoundPullEventListener<ListView> soundEvend = new SoundPullEventListener<>(this);
 //根据Flag设置拉出时的声音
 soundEvend.addSoundEvent(PullToRefreshBase.State.PULL_TO_REFRESH, R.raw.pull_event);
 //拉出的控件回退时的声音
 soundEvend.addSoundEvent(PullToRefreshBase.State.RESET, R.raw.reset_sound);
 //正在刷新时的声音
 soundEvend.addSoundEvent(PullToRefreshBase.State.REFRESHING, R.raw.refreshing_sound);
 //为刷新控件绑定我们的设置
 pullToRefreshListView.setOnPullEventListener(soundEvend);

这样刷新时的声音也有了,快去试试吧~

对了,在使用PullToRefreshListView的时候遇到过一个问题,就是ListItem的点击事件每次的position都是需要-1才与当前item相对应,因为下拉刷新的时候相当于在ListView的最上方又添加了一个条目,所以设置其对应的点击事件的时候要注意position-1。

这个是PullToRefresh的library,按照上面说的步骤导入就可以使用了:链接:http://pan.baidu.com/s/1cqp9JS 密码:a12j
这个是PullToRefresh的官方Demo,特别全,感兴趣的朋友可以下载下来研究一下:http://pan.baidu.com/s/1ge8gerh

当然,这里我们只是简单的使用PullToRefresh,只是可以实现其刷新功能,更多的定制还需要在研究了~

另外,我觉得这篇写的入门文章也可以,可以看看http://www.jb51.net/article/93183.htm

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android应用程序“R文件”消失

    其实Android自己维护这一个 public final class R类主要是跟新资源文件,这个R.java无需我们自己去修改,如果你不了解千万不要去修改它,它定义的每个资源值都是唯一的,不会和系统冲突.这个文件由ADT插件自动更新,当你编辑过Res文件后保存,这个类就会自动更新. R.java里面一般有attr.drawable.id.raw.layout.string以及xml等,根据你工程使用的资源而定.当R.java文件丢失时,就需要重建这个,但是可能会存在一些问题,比如资源无法自动

  • Android 画一个太极图实例代码

    今天练手一下,一起来画个太极图吧~ 最终效果如下: 最终效果 一般都是先讲原理,我就反其道而行,先讲实现吧. 1.继承实现初始化方法 继承View,实现基本的构造函数: public TestView(Context context) { this(context, null); } public TestView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TestView(Context c

  • Android app启动时黑屏或者白屏的原因及解决办法

    1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背景图Theme 通过设置一张背景图. 当程序启动时,首先显示这张背景图,避免出现黑屏 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name=&qu

  • 设计简单的Android图片加载框架

    目前Android 发展至今优秀的图片加载框架太多,例如: Volley ,Picasso,Imageloader,Glide等等.但是作为程序猿,懂得其中的实现原理还是相当重要的,只有懂得才能更好地使用.于是乎,今天我就简单设计一个网络加载图片框架.主要就是熟悉图片的网络加载机制. 一般来说,一个优秀的 图片加载框架(ImageLoader) 应该具备如下功能: 图片压缩 内存缓存 磁盘缓存 图片的同步加载 图片的异步加载 网络拉取 那我们就从以上几个方面进行介绍: 1.图片压缩(有效的降低O

  • Android 带有删除按钮的EditText

    MainActivity如下: package cc.textview5; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; import android.app.Activity;

  • Android5.0多种侧滑栏效果实例代码

    1.普通侧滑 效果图: 思路:通过自定义View继承HorizontalScrollView,然后重写onMeasure(),onLayout(),onTouchEvent() 方法并设置menu(通过动画使menu开始时处于隐藏状态)布局和content布局.(注意:使用ViewHelper类需要导入nineoldandroids-2.4.0.jar包) menu(left_menu)布局代码: <?xml version="1.0" encoding="utf-8&

  • Android实现点击两次BACK键退出应用

    思路:Android中捕获用户按键是在onKeyDown方法中,只需要判断用户按键是否是KEYCODE_BACK即后退键即可,剩下的即为判断两次点击BACK键时间间隔问题了. 第一种实现方式: package com.example.clickexittest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import an

  • Android 中 退出多个activity的经典方法

    1.使用List集合方式 用list保存activity实例,然后逐一干掉 import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.content.DialogInterface; import android.content.Inte

  • Android下拉刷新控件PullToRefresh实例解析

    Android中很多时候都会用到上下拉刷新,这是一个很常用的功能,Android的v4包中也为我们提供了一种原生的下拉刷新控件--SwipeRefreshLayout,可以用它实现一个简洁的刷新效果,但今天我们的主角并不是它,而是一个很火的第三方的上下拉刷新控件--PullToRefresh.PullToRefresh包括PullToRefreshScrollView.PullToRefreshListView.PullToRefreshGridView等等很多为我们提供的控件,我们可以在xml

  • Android下拉刷新控件SwipeRefreshLayout源码解析

    SwipeRefreshLayout是Android官方的下拉刷新控件,使用简单,界面美观,不熟悉的朋友可以随便搜索了解一下,这里就不废话了,直接进入正题. 首先给张流程图吧,标出了几个主要方法的作用,可以结合着看一下哈. 这种下拉刷新控件的原理不难,基本就是监听手指的运动,获取手指的坐标,通过计算判断出是哪种操作,然后就是回调相应的接口了.SwipeRefreshLayout是继承自ViewGroup的,根据Android的事件分发机制,触摸事件应该是先传递到ViewGroup,根据onInt

  • Android PullToRefreshLayout下拉刷新控件的终结者

    说到下拉刷新控件,网上版本有很多,很多软件也都有下拉刷新功能.有一个叫XListView的,我看别人用过,没看过是咋实现的,看这名字估计是继承自ListView修改的,不过效果看起来挺丑的,也没什么扩展性,太单调了.看了QQ2014的列表下拉刷新,发现挺好看的,我喜欢,贴一下图看一下qq的下拉刷新效果: 不错吧?嗯,是的.一看就知道实现方式不一样.咱们今天就来实现一个下拉刷新控件.由于有时候不仅仅是ListView需要下拉刷新,ExpandableListView和GridView也有这个需求,

  • Android自定义下拉刷新控件RefreshableView

    这是在了解下拉刷新功能原理下的产物,下拉刷新可以说是国产APP里面必有的功能,连Google都为此出了SwipeRefreshLayout,一种MD风格的下拉刷新. 不过,MD风格在国内似乎很是艰难,不单单是国内系统主流仍是4.4的原因,也有用户习惯的问题,扯的有点多了,在看了许多博客之后,我突然想写一个能仿照 SwipeRefreshLayout 的兼容所有控件的下拉刷新,不单单只是 ListView,希望它也可以包容普通的View和ScrollView,经过两天的奋斗,终于搞定了,因为我的目

  • Android实现支持所有View的通用的下拉刷新控件

    下拉刷新对于一个app来说是必不可少的一个功能,在早期大多数使用的是chrisbanes的PullToRefresh,或是修改自该框架的其他库.而到现在已经有了更多的选择,github上还是有很多体验不错的下拉刷新. 而下拉刷新主要有两种实现方式: 1. 在ListView中添加header和footer,监听ListView的滑动事件,动态设置header/footer的高度,但是这种方式只适用于ListView,RecyclerView. 2. 第二种方式则是继承ViewGroup或其子类,

  • Android官方下拉刷新控件SwipeRefreshLayout使用详解

    可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿出来分享. 简介: SwipeRefreshLayout组件只接受一个子组件:即需要刷新的那个组件.它使用一个侦听机制来通知拥有该组件的监听器有刷新事件发生,换句话说我们的Activity必须实现通知的接口.该Activity负责处理事件刷新和刷新相应的视图.一旦监听者接收到该事件,就决定了刷新过程中应处理的地方.如果要展示一个"刷新动画",它必须

  • Android开发之无痕过渡下拉刷新控件的实现思路详解

    相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废话不多说!往下看嘞! 1.市面一些下拉刷新控件普遍缺陷演示 以直播吧APP为例: 第1种情况: 滑动控件在初始的0位置时,手势往下滑动然后再往上滑动,可以看到滑动到初始位置时滑动控件不能滑动. 原因: 下拉刷新控件响应了触摸事件,后续的一系列事件都由它来处理,当滑动控件到顶端的时候,滑动事件都被下拉刷新控件消费掉了,传递不到它的子控件

  • Android巧用XListView实现万能下拉刷新控件

    摘要:想必大家做开发的时候都会用到下拉刷新的控件,现在各种第三方的下拉刷新控件不胜枚举.当然最NB的还是XListView.其他也有针对GridView,ScrollView,LinearLayout进行重写的下拉刷新控件.本文针对xListView采取一种巧用办法,可以实现各种控件的下拉刷新. 这种巧用思路有人可能已经想到,因为ListView本身就有addHeaderView方法,用该方法我们可以添加任何布局的View.因此本文的思路就是往xListView的头部添加我们自定义写的布局文件.

  • Android实现简单的下拉刷新控件

    背景:列表控件在Android App开发中用到的场景很多.在以前我们用ListView,GradView,现在应该大多数开发者都已经在选择使用RecyclerView了,谷歌给我们提供了这些方便的列表控件,我们可以很容易的使用它们.但是在实际的场景中,我们可能还想要更多的能力,比如最常见的列表下拉刷新,上拉加载.上拉刷新和下拉加载应该是列表的标配吧,基本上有列表的地方都要具体这个能力.虽然刷新这个功能已经有各种各样的第三方框架可以选择,但是毕竟不是自己的嘛,今天我们就来实现一个自己的下拉刷新控

  • Android下拉刷新框架实现代码实例

    前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但这些demo的质量参差不齐,用户体验也不好,接口设计也不行.最张没办法,终于忍不了了,自己就写了一个下拉刷新的框架,这个框架是一个通用的框架,效果和设计感觉都还不错,现在分享给各位看官. 一. 关于下拉刷新 下拉刷新这种用户交互最早由twitter创始人洛伦•布里切特(Loren Brichter)发明,有理论认为,下拉刷新是一种适用于按照从新到旧的时间顺序排列feeds的应用,在这种应用场景中看完旧的内容时,用户会很自然地下

随机推荐