Android-PullToRefresh 使用心得

2023-11-01 20:38

本文主要是介绍Android-PullToRefresh 使用心得,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


目前下拉刷新已经满大街都是,在自己的应用如果不使用这个模式的话,出门都不好意思和人家打招呼,该文章就是简单探讨下针对于 github 上的这个开源项目的使用心得。

为什么是它?因为在 stackoverflow 上大家都说它不错,所以就试试看吧!该项目的位置 Android-PullToRefresh 遗憾的是目前已经停止维护,但是已经足够强大所以不维护就不维护吧!

注意:对应的还有一个项目,也是这个作者刚刚开的 ActionBar-PullToRefresh 这个是在 actionbar 上增加下拉的效果,Android-PullToRefresh 这个工程在我们下拉的时候会有一个 view 显示出来,而这个工程直接就是利用 actionbar 来显示,注意这两者的区别

首先,看看目前几个主流 app 的下拉刷新的效果。

sina 微博



网易新闻


腾讯微博


接下来,是我们自己实现后的效果



从图片来看非常的相似,所以接下来我们就看看这个开源的 lib 如何使用。

源码下载下来之后将 library 这个目录中的代码放到一个位置,然后在主工程中去引用它,通常都是在主工程的 project.properties 中去指定引用的位置

[plain]  view plain copy
  1. android.library.reference.4=library/Android-PullToRefresh  

因为这个是我工程中加入的第四个引用的库,所以是 reference.4,如果这是你的第一个的话,那么应该是 reference.1,这个关于库的引用在 android sdk 的 samples 目录下可以找到了两个工程 " TicTacToeLib " 和 " TicTacToeMain " 来自己参考下。

好了,先 build 下Android-PullToRefresh 生成 jar 包,然后在 build 主工程,应该没什么问题,继续。

接下来就关于这个部分的使用,使用主要考虑两个方法:1. 这个 lib 的基本功能的使用,2. 这个 lib 的自定义扩展

基本功能的使用

1. 在 layout 文件中对应的 listview 不能使用 android 原生的 listview,而是要使用 PullToRefreshListView 代码如下

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:orientation="vertical">  
  7.   
  8.     <com.handmark.pulltorefresh.library.PullToRefreshListView  
  9.         xmlns:ptr="http://schemas.android.com/apk/res-auto"  
  10.         android:id="@+id/my_list"  
  11.         android:layout_width="fill_parent"  
  12.         android:layout_height="fill_parent"  
  13.         android:cacheColorHint="#00000000"  
  14.         android:fadingEdge="none"  
  15.         android:fastScrollEnabled="false"  
  16.         android:footerDividersEnabled="false"  
  17.         android:headerDividersEnabled="false"  
  18.         android:smoothScrollbar="true"  
  19.         ptr:ptrAnimationStyle="flip"  
  20.         ptr:ptrHeaderTextAppearance="@android:attr/textAppearanceMedium"/>  
  21.   
  22.     <!-- Here is the view to show if the list is emtpy -->  
  23.     <ScrollView android:id="@+id/empty"  
  24.         android:layout_width="fill_parent"  
  25.         android:layout_height="fill_parent"  
  26.         android:fillViewport="true">  
  27.   
  28.         <LinearLayout  
  29.             android:layout_width="fill_parent"  
  30.             android:layout_height="wrap_content"  
  31.             android:orientation="vertical">  
  32.   
  33.             <TextView  
  34.                 android:id="@+id/emptyText"  
  35.                 android:layout_width="fill_parent"  
  36.                 android:layout_height="fill_parent"  
  37.                 android:text="@string/noText"  
  38.                 android:textSize="20sp"  
  39.                 android:textColor="?android:attr/textColorSecondary"  
  40.                 android:paddingLeft="10dip"  
  41.                 android:paddingRight="10dip"  
  42.                 android:paddingTop="10dip"  
  43.                 android:lineSpacingMultiplier="0.92"  
  44.                 android:gravity="center" />  
  45.         </LinearLayout>  
  46.     </ScrollView>  
  47. </LinearLayout>  
在这个 layout 中分为上下两个部分,上面是一个 listview, 下面是一个 empty view,用来在没有内容的时候显示,通过 listview 的  setEmptyView() 就可以达到这个效果,千万不要自己费事去写两个 view 的逻辑控制代码。

关于 ptr:XXX 属性的使用,会在自定义扩展的那个部分解释下,这里暂时跳过。

2. 在代码中使用这个 listview,代码如下

[java]  view plain copy
  1. private PullToRefreshListView mList;  
  2.   
  3. @Override  
  4. protected void onCreate(Bundle savedInstanceState) {  
  5.     // ...  
  6.   
  7.     mList = (PullToRefreshListView)findViewById(R.id.my_list);  
  8.     mList.setEmptyView(findViewById(R.id.empty));  
  9.     mList.setOnItemClickListener(new OnItemClickListener() {  
  10.   
  11.         @Override  
  12.         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  13.             if (DEBUG) Log.d(TAG, "onItemClick() : pos=" + position + ", id=" + id);  
  14.             parent.getAdapter().getItem(position);  // @warning: Should not use mAdapter  
  15.               
  16.             // do something  
  17.         }  
  18.   
  19.     });  
  20.   
  21.     mList.setOnPullEventListener(new OnPullEventListener<ListView>() {  
  22.   
  23.         @Override  
  24.         public void onPullEvent(PullToRefreshBase<ListView> refreshView, State state,  
  25.                 Mode direction) {  
  26.             if (DEBUG) Log.d(TAG, "onPullEvent() : " + state.name());  
  27.   
  28.             if (state.equals(State.PULL_TO_REFRESH)) {  
  29.                 refreshView.getLoadingLayoutProxy().setPullLabel(getString(R.string.pull_to_refresh));  
  30.                 refreshView.getLoadingLayoutProxy().setReleaseLabel(getString(R.string.release_to_refresh));  
  31.                 refreshView.getLoadingLayoutProxy().setRefreshingLabel(getString(R.string.loading));  
  32.   
  33.                 String label = DateUtils.formatDateTime(getApplicationContext(),  
  34.                         System.currentTimeMillis(),  
  35.                         DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);  
  36.                 // Update the LastUpdatedLabel  
  37.                 refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(  
  38.                         getString(R.string.updated) + " : " + label);  
  39.             }  
  40.         }  
  41.     });  
  42.   
  43.     mList.setOnRefreshListener(new OnRefreshListener<ListView>() {  
  44.         @Override  
  45.         public void onRefresh(PullToRefreshBase<ListView> refreshView) {  
  46.             if (DEBUG) Log.d(TAG, "onRefresh()");  
  47.   
  48.             // Do work to refresh the list here.  
  49.             refresh();  
  50.         }  
  51.     });  
  52.   
  53.     // ...  
  54. }  
此处有几个地方要注意:
1. 如果想对 list item 点击之后做一些事情,此处有个问题要注意下,那就是我们的下来显示的 view 是 header view,所以此处在 onItemClick() 函数中传入的 position 不是从 0 开始而是从 1 开始,如果我们使用通常情况下的 mAdapter 去 getItem() 则实际中始终获取的都是我们点击 item 的下一个 item 的位置,所以此处我们要通过传进来的 parent 的 adapter 来获取 item,详细可以参考 当ListView有Header时,onItemClick里的position不正确

2. 因为下拉的时候显示的文字,每个人有每个的需求,所以会不一样,所以就需要使用 setOnPullEventListener() 来更新文字,这个开源库自己提供的 sample 中更新文字是放到 setOnRefreshListener() 中,但是那个只是在刷新的时候才更新问题,通过对比那些常用 app 的下拉效果你会发现那个时候在更新已经慢了,所以要放到这里

3. 此处代码没有列出来,就是 refresh 完了之后要把 pull view hide 起来,调用 onRefreshComplete() 即可,详情可以参考它自己提供的 sample。

4. 还要注意的是,还有很大的需求是点击刷新,那么点击之后这个 pull view 也要 show 出来,但是不应该 show "下拉可以刷新" 和 "松开可以刷新" 这两个画面,而是直接显示正在刷新的那个画面,这要怎么做到的呢?通过setRefreshing()这个函数即可做到,对应有另外一个函数叫做demo() 它包括了 “下拉->松开->刷新” 的整个过程,这是我们在这种条件下不需要的。

5. 在它自己的 sample 中还可以增加声音的效果,这个比较简单,自己看下即可。

Android-PullToRefresh 自定义扩展

此处的扩展指的是不修改这个开源库任何一行本身的代码来实现自定义一些属性,那些属性可以自定义这个可以在这个库的 values/attrs.xml 中看到,我们使用的时候就像上面 layout 中的写法一样,首先包含下命名空间,然后就可以指定对应的属性

[html]  view plain copy
  1. <com.handmark.pulltorefresh.library.PullToRefreshListView  
  2.         xmlns:ptr="http://schemas.android.com/apk/res-auto"  
  3.         android:id="@+id/my_list"  
  4.         android:layout_width="fill_parent"  
  5.         android:layout_height="fill_parent"  
  6.         android:cacheColorHint="#00000000"  
  7.         android:fadingEdge="none"  
  8.         android:fastScrollEnabled="false"  
  9.         android:footerDividersEnabled="false"  
  10.         android:headerDividersEnabled="false"  
  11.         android:smoothScrollbar="true"  
  12.         ptr:ptrAnimationStyle="flip"  
  13.         ptr:ptrHeaderTextAppearance="@android:attr/textAppearanceMedium"/>  
"xmlns:ptr="http://schemas.android.com/apk/res-auto" 声明下,然后可以使用 ptr:XXX 的属性了。

一些属性的简单说明

ptrAnimationStyle :  flip 这个效果是有向下和向上的两个箭头的,rotate 没有箭头不管怎么拉都是一个 progress bar

ptrMode :both 指的是 listview 的上面和下面都有这种拉动刷新的效果,下面的刷新通常我们在滑到最下面然后 loading 数据的时候可以看到

其他的属性可以在 attrs.xml 中看它的注释来理解,总之一句话,尽量少自己造轮子先看看作者有没有提供接口。



转自:http://blog.csdn.net/wwhh393/article/details/9722199

这篇关于Android-PullToRefresh 使用心得的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325594

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求