热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要为大家详细解析了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

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

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

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

 }

 //完成上拉刷新操作
 @Override
 public void onPullUpToRefresh(PullToRefreshBase 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 datas;
 private ArrayAdapter 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(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() {
 //完成下拉刷新操作
 @Override
 public void onPullDownToRefresh(PullToRefreshBase 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 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 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,只是可以实现其刷新功能,更多的定制还需要在研究了~ 

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

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


推荐阅读
  • 利用IDEA高效构建Maven Spring MVC项目环境
    本文详细介绍了如何使用IntelliJ IDEA高效搭建Maven Spring MVC项目环境。首先,通过创建一个新的Maven项目,设置好GroupId、ArtifactId和Version等基本信息。接着,配置项目的依赖和插件,确保Spring MVC框架能够顺利集成。最后,通过IDEA的内置工具完成项目的初始化和测试,为后续开发打下坚实基础。 ... [详细]
  • 本文详细解析了如何利用Appium与Python在真实设备上执行测试示例的方法。首先,需要开启手机的USB调试功能;其次,通过数据线将手机连接至计算机并授权USB调试权限。最后,在命令行工具中验证设备连接状态,确保一切准备就绪,以便顺利进行测试。 ... [详细]
  • 本文将详细介绍如何利用JMeter高效执行API接口测试,涵盖JMeter的基础介绍、安装方法、中文环境配置、主要元件及其作用域和执行顺序等内容,并分享一系列实用的测试技巧,帮助读者全面掌握JMeter接口测试的全过程。 ... [详细]
  • Dapper:一款高效轻量的ORM框架
    Dapper 是一个高效且轻量级的 ORM(对象关系映射)框架,由 StackExchange 开发并维护。它旨在提供快速的数据访问性能,同时保持代码的简洁性和易用性。Dapper 可以显著提高开发效率,特别适用于需要高性能数据操作的应用场景。更多详细信息可参考其官方文档和 GitHub 仓库。 ... [详细]
  • 在处理Java程序时,中文乱码是一个常见的问题。本文将详细探讨导致中文乱码的原因,并分享有效的解决方案,帮助开发者在实际工作中避免这一问题。通过具体的代码示例和最佳实践,本文旨在提供全面的指导,确保中文字符在不同环境下的正确显示。 ... [详细]
  • Ajax技术主要应用于JavaScript中,对于ASP的要求相对较低,ASP仅需在后台处理和操作服务器端数据。具体实现过程可以分为以下几个步骤:1. 设计前端表单;2. 使用JavaScript编写Ajax请求,将表单数据发送到服务器;3. 服务器端通过ASP处理请求并返回验证结果;4. 前端根据返回的结果进行相应的用户反馈。这种技术不仅提升了用户体验,还提高了表单验证的效率和安全性。 ... [详细]
  • JMeter(六):组件作用范围与执行流程详解
    在《JMeter(六):组件作用范围与执行流程详解》中,我们将深入探讨组件的作用范围及其执行流程。不同于测试计划和线程组,JMeter中的八类可执行组件具有特定的作用域,这些组件在测试过程中发挥着不同的功能。本文将详细解析这些组件的作用范围,并介绍它们在测试执行过程中的具体行为和相互关系。通过本文,读者将能够更好地理解和优化JMeter测试脚本的设计与执行。 ... [详细]
  • 前面简单总结了js的基本语法,其实js语法和java、C语言语法有很多的相同之处;接下来将总结js在WEB浏览器中的运用,这部门将要了解的 ... [详细]
  • DiskGenius是一款国内知名的磁盘管理与数据恢复工具,提供全面的分区管理、数据恢复和磁盘诊断功能,适用于各种存储设备,操作简便且功能强大。 ... [详细]
  • 将 Eclipse 中的 Java Web 项目迁移至 IntelliJ IDEA 并配置 Tomcat 环境
    为了适应更高效的工作流程,本文详细介绍了如何将基于Eclipse构建的Java Web项目迁移到IntelliJ IDEA,并在新环境中配置Tomcat服务器,以确保项目的顺利运行。此过程不仅涉及项目文件的转移,还包括解决可能遇到的兼容性问题和环境配置挑战。通过本文的指导,开发者可以轻松实现从Eclipse到IntelliJ IDEA的过渡,提升开发效率。 ... [详细]
  • 在Maven中高效管理多模块项目的依赖关系是一项重要的技能。通过合理配置父POM文件,可以统一管理和控制各子模块的依赖版本,避免重复导入和版本冲突。本文将探讨如何利用Maven的最佳实践,确保项目依赖的一致性和可维护性,同时提高开发效率。 ... [详细]
  • BIRT概述与安装指南
    本文旨在介绍BIRT(Business Intelligence and Reporting Tools)的基本概念及其安装流程。首先,详细解析了BIRT的定义、组成结构及其核心优势。随后,提供了BIRT报表制作工具的安装指南,包括下载源的选择与安装步骤,帮助用户快速上手并利用BIRT进行高效的数据分析与报告生成。 ... [详细]
  • 本文旨在构建一个JavaScript函数,用于对用户输入的电子邮件地址和密码进行有效性验证。该函数将确保输入符合标准格式,并检查密码强度,以提升用户账户的安全性。通过集成正则表达式和条件判断语句,该方法能够有效防止常见的输入错误,同时提供即时反馈,改善用户体验。 ... [详细]
  • 本文详细解析了J19标准中集合对象的Map接口,深入探讨了其核心功能与应用场景。Map接口用于将唯一键映射到相应的值,确保每个键在映射中唯一且仅能对应一个值。此外,文章还对比了Map接口与Collection接口的主要区别,强调了Map作为双列数据结构的特点,为开发者提供了更加全面的理解和实用指导。 ... [详细]
  • OpenCV 2.4.9 源码解析:级联分类器的错误率与尺寸分析 ... [详细]
author-avatar
小青年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有