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

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma