pullToRefresh下拉刷新上拉加载

 

PullToRefresh 是一个第三方的工程。

之前的自定义下拉刷新控件貌似不太好用,于是网上找了这个。

参考:http://www.cnblogs.com/summers/p/4343964.html

主要是一些功能都提供了接口,不需要自己再写了。

废话不多说,上干货。

1、布局文件

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical" >  <!--     ptr:ptrAnimationStyle="flip"  flip:翻转  rotate:旋转-->  <!--     ptr:ptrShowIndicator="true"  右上角 右下角出现箭头-->  <com.handmark.pulltorefresh.library.PullToRefreshListView  xmlns:ptr="http://schemas.android.com/apk/res-auto"  android:id="@+id/pullToRefresh" android:layout_width="match_parent" android:layout_height="wrap_content" ptr:ptrDrawable="@drawable/default_ptr_flip" ptr:ptrAnimationStyle="flip" ptr:ptrHeaderBackground="#383838" ptr:ptrHeaderTextColor="#FFFFFF" /> </LinearLayout> 

其中有一些属性需要说明,

ptr是pullToRefresh的配置属性 使用是需要添加 xmlns:ptr="http://schemas.android.com/apk/res-auto"

 

ptr:ptrDrawable=“” 上拉下拉图标

ptr:ptrAnimationStyle=""  图标动画  取值: flip:翻转 rotate旋转

ptr:ptrHeaderBackground=""  上拉下拉时 头部的背景色

ptr:ptrHeaderTextColor=""     上拉下拉时 文字颜色

ptrRefreshableViewBackground 设置整个mPullRefreshListView的背景色

ptrScrollingWhileRefreshingEnabled刷新的时候,是否允许ListView或GridView滚动。觉得为true比较好。(这个本人亲测,不支持这个属性,不知道为什么)

ptrListViewExtrasEnabled 决定了Header,Footer以何种方式加入mPullRefreshListView,true为headView方式加入,就是滚动时刷新头部会一起滚动。(这个本人亲测,不支持这个属性,不知道为什么)

注:上述属性都可以代码添加,请用pullToRefresh.set查看

2、MainActivity代码

public class MainActivity extends ActionBarActivity {  private PullToRefreshListView pullToRefresh;  private List<PullBean> data = new ArrayList<PullBean>();  MyAdapter adapter;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  pullToRefresh = (PullToRefreshListView) findViewById(R.id.pullToRefresh); data = getData(); adapter = new MyAdapter(this); pullToRefresh.setAdapter(adapter); /* * Mode.BOTH:同时支持上拉下拉 * Mode.PULL_FROM_START:只支持下拉Pulling Down * Mode.PULL_FROM_END:只支持上拉Pulling Up */ /* * 如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、onPullUpToRefresh()两个方法。 * 如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,同时实现onRefresh()方法。 * 当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法, * Mode.PULL_FROM的时候只调用onPullUpToRefresh()方法. */ pullToRefresh.setMode(Mode.BOTH); init(); /* * setOnRefreshListener(OnRefreshListener listener):设置刷新监听器; * setOnLastItemVisibleListener(OnLastItemVisibleListener listener):设置是否到底部监听器; * setOnPullEventListener(OnPullEventListener listener);设置事件监听器; * onRefreshComplete():设置刷新完成 */ /* * pulltorefresh.setOnScrollListener() */ // SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动 // SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) // SCROLL_STATE_IDLE(0) 停止滚动 /* * setOnLastItemVisibleListener * 当用户拉到底时调用 */ /* * setOnTouchListener是监控从点下鼠标 (可能拖动鼠标)到放开鼠标(鼠标可以换成手指)的整个过程 ,他的回调函数是onTouchEvent(MotionEvent event), * 然后通过判断event.getAction()是MotionEvent.ACTION_UP还是ACTION_DOWN还是ACTION_MOVE分别作不同行为。 * setOnClickListener的监控时间只监控到手指ACTION_DOWN时发生的行为 */ pullToRefresh.setOnRefreshListener(new OnRefreshListener2<ListView>(){ @Override public void onPullDownToRefresh( PullToRefreshBase<ListView> refreshView) { // TODO Auto-generated method stub PullBean bean = new PullBean(); bean.setTitle("下拉刷新"); bean.setContent("我的神"); adapter.addFirst(bean); new FinishRefresh().execute(); adapter.notifyDataSetChanged(); } @Override public void onPullUpToRefresh( PullToRefreshBase<ListView> refreshView) { // TODO Auto-generated method stub PullBean bean = new PullBean(); bean.setTitle("上拉刷新"); bean.setContent("我的神"); adapter.addLast(bean); new FinishRefresh().execute(); adapter.notifyDataSetChanged(); } }); // pullToRefresh.setOnRefreshListener(new OnRefreshListener<ListView>() { // // @Override // public void onRefresh(PullToRefreshBase<ListView> refreshView) { // // TODO Auto-generated method stub // String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), // DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); // // // Update the LastUpdatedLabel // refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); // PullBean bean = new PullBean(); // bean.setTitle("我的神"); // bean.setContent("我的神"); // adapter.addFirst(bean); // new FinishRefresh().execute(); // } // // });  } private void init() { ILoadingLayout startLabels = pullToRefresh .getLoadingLayoutProxy(true, false); startLabels.setPullLabel("下拉刷新...");// 刚下拉时,显示的提示 startLabels.setRefreshingLabel("正在载入...");// 刷新时 startLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示  ILoadingLayout endLabels = pullToRefresh.getLoadingLayoutProxy( false, true); endLabels.setPullLabel("上拉刷新...");// 刚下拉时,显示的提示 endLabels.setRefreshingLabel("正在载入...");// 刷新时 endLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示 // // 设置下拉刷新文本 // pullToRefresh.getLoadingLayoutProxy(false, true) // .setPullLabel("上拉刷新..."); // pullToRefresh.getLoadingLayoutProxy(false, true).setReleaseLabel( // "放开刷新..."); // pullToRefresh.getLoadingLayoutProxy(false, true).setRefreshingLabel( // "正在加载..."); // // 设置上拉刷新文本 // pullToRefresh.getLoadingLayoutProxy(true, false) // .setPullLabel("下拉刷新..."); // pullToRefresh.getLoadingLayoutProxy(true, false).setReleaseLabel( // "放开刷新..."); // pullToRefresh.getLoadingLayoutProxy(true, false).setRefreshingLabel( // "正在加载...");  } private List<PullBean> getData(){ List<PullBean> list = new ArrayList<PullBean>(); for(int i = 0;i < 10;i ++){ PullBean bean = new PullBean(); bean.setTitle("item " + i + " 搜索业务增速下滑 Google廉颇老矣?"); bean.setContent("Google于10月17日发布了2014年第三季度财报"); list.add(bean); } return list; } private class FinishRefresh extends AsyncTask<Void, Void, Void>{ @Override protected Void doInBackground(Void... params) { try { Thread.sleep(1000); } catch (InterruptedException e) { } return null; } @Override protected void onPostExecute(Void result){ // adapter.notifyDataSetChanged();  pullToRefresh.onRefreshComplete(); } } private class MyAdapter extends BaseAdapter{ private LayoutInflater mInflater; public MyAdapter(Context context) { // TODO Auto-generated constructor stub mInflater = LayoutInflater.from(context); } public void addFirst(PullBean bean){ data.add(0, bean); } public void addLast(PullBean bean){ data.add(bean); } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return data.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder viewHolder = null; if(convertView == null){ viewHolder = new ViewHolder(); convertView = mInflater.inflate(R.layout.item, null); viewHolder.title = (TextView) convertView.findViewById(R.id.title); viewHolder.content = (TextView) convertView.findViewById(R.id.content); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.title.setText(data.get(position).getTitle()); viewHolder.content.setText(data.get(position).getContent()); return convertView; } class ViewHolder{ TextView title; TextView content; } } } 

pullToRefresh适配器Adapter和listview也是继承于BaseAdapter 看一下item的布局

 

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:padding="5dp"  android:orientation="vertical" >  <TextView  android:id="@+id/title"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:textSize="18sp"  android:textColor="#BA55D3"  android:text="我的神"/>  <TextView   android:id="@+id/content"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:textSize="14.0sp"  android:layout_marginTop="5dp"  android:textColor="#7CFC00"  android:text="我的神"/>  
</LinearLayout>  

pullToRefresh 通过setMode来设置是否可以上拉下拉

 

Mode.BOTH:同时支持上拉下拉

Mode.PULL_FROM_START:只支持下拉Pulling Down

Mode.PULL_FROM_END:只支持上拉Pulling Up

也可以用 ptr:ptrMode="both"

可选值为:disabled(禁用下拉刷新),pullFromStart(仅支持下拉刷新),pullFromEnd(仅支持上拉刷新),both(二者都支持),manualOnly(只允许手动触发)

如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、onPullUpToRefresh()两个方法。 

如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,同时实现onRefresh()方法。

当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法,Mode.PULL_FROM的时候只调用onPullUpToRefresh()方法.

如果想上拉、下拉刷新的时候 做一样的操作,那就用OnRefreshListener,上拉下拉的时候都调用

如果想上拉、下拉做不一样的的操作,那就在setOnRefreshListener时 用new OnRefreshListener2<ListView>

当然如果想自己设置上拉下拉中的文字 可以这样

pullToRefresh.getLoadingLayoutProxy(false, true)  .setPullLabel("上拉刷新...");  
pullToRefresh.getLoadingLayoutProxy(false,true)
.setReleaseLabel( "放开刷新...");  
pullToRefresh.getLoadingLayoutProxy(false,true)
.setRefreshingLabel("正在加载...");  
// 设置上拉刷新文本  
pullToRefresh.getLoadingLayoutProxy(true, false)  .setPullLabel("下拉刷新...");  
pullToRefresh.getLoadingLayoutProxy(true,false)
.setReleaseLabel("放开刷新...");  
pullToRefresh.getLoadingLayoutProxy(true,false)
.setRefreshingLabel( "正在加载...");  

显然在实际操作的时候也会用到其他监听

 setOnScrollListener()

 SCROLL_STATE_TOUCH_SCROLL 正在滚动      SCROLL_STATE_FLING 手指做了抛的动作(手指离开屏幕前,用力滑了一下)      SCROLL_STATE_IDLE 停止滚动     

setOnLastItemVisibleListener

当用户拉到底时调用  

setOnItemClickListener()

为pullToRefresh中每一个item设置事件

代码下载:点击下载代码

下拉上拉 图标和文字 位置改动是在PullToRefresh源代码中改的即:PullToRefreshListView.handleStyledAttributes 中lp的Gravity改为CENTER_VERTICAL

如果想要改动图标和文字的距离和布局 在这library项目下这两个文件改

pull_to_refresh_header_horizontal.xml

pull_to_refresh_header_vertical.xml

转载于:https://www.cnblogs.com/a446276468/p/5387151.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS删除地图投影坐标,只保留地理坐标

今天突发奇想,在ArcGIS中进行投影转换很容易,那么如何删除投影坐标,只保留地理坐标呢? 一开始想着从投影文件(.prj)入手,删除其投影信息,结构不尽如人意。 如果从定义地理坐标(Define Projection)的角度入手,重新定义地理坐标,如WGS84呢?经过尝试之…

RHEL5U8配置Centos yum源

由于RHEL的yum在线更新是收费的&#xff0c;如果没有注册的话是不能使用的&#xff0c;即不能在线安装软件。在这种情况下&#xff0c;如果我们使用的机器安装的是RHEL系统要是每次安装软件先挂载本地光盘会很繁琐&#xff0c;而且有些软件也是老版本的&#xff0c;这种情况下我…

剑指offer之圆圈最后剩下的数

1 问题 求圆圈最后剩下的数&#xff0c;比如数组0, 1, 2 ,3 ,4围城一个环&#xff0c;我们每次去掉第三个数字&#xff0c;删除的前4个数字依次是2, 0, 4, 1&#xff0c;最后剩下的数字是3 04 13 2 2 思路 我们用list,我们要支持环就这样,如果发现当…

如何获取 Linq 查询结果集合中的索引?

咨询区 Guy我有下面一段伪代码&#xff1a;string[] s {"zero", "one", "two", "three", "four", "five"};var x s .Select((a,i) > new {Value a, Index i}) .Where(b > b.Value.StartsWith("t&…

AirTest 基本使用及框架浅剖析——五分钟上手制作游戏辅助

简介 Airtest Project 是为编写自动化脚本&#xff0c;达到提升测试效率的一整套解决方案。它可以轻松的扩展到多平台、多引擎上&#xff1b;如基础的 Android和IOS手机应用、App&#xff1b;Windows上的应用等。 学习使用 Airtest Project 很容易&#xff0c;由于 Airtest P…

计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...

3.2.1 数据传送指令1. MOVOPRD1,OPRD2MOV是操作码&#xff0c;OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。源操作数可以是累加器、寄存器、存贮器以及立即操作数&#xff0c;而目的操作数可以是累加器、寄存器和存贮器…

Chrome浏览器常见问题及解决方案集锦

Chrome是一款非常优秀的浏览器,尤其在网页调试方面出类拔萃,深得本人的喜欢。但是在使用的过程中,总有一些问题会困扰大家,现将一些常见问题及解决方案列举出来,供参考。 1. Chrome下遇到该网页已屏蔽插件adobe flash player的解决办法 适合以下情形: (1)确定在电…

Facebook用户遭遇千年虫:瞬间有了46年老友

一些Facebook用户今天碰到了一个有趣的bug&#xff0c;系统提示他们与好友有了46年长的好友关系。要知道&#xff0c;Facebook还不到15岁&#xff0c;很多用户也没有46岁的高龄。Facebook一直没有透露产生这个bug的原因&#xff0c;但它说已经意识到该问题。“我们已经确定了这…

ASP.Net 验证正则表达式

整数或者小数&#xff1a;^[0-9]\.{0,1}[0-9]{0,2}$ 只能输入数字&#xff1a;"^[0-9]*$"。只能输入n位的数字&#xff1a;"^\d{n}$"。只能输入至少n位的数字&#xff1a;"^\d{n,}$"。只能输入m~n位的数字&#xff1a;。"^\d{m,n}$"只…

python123输出hello world_Python基础:输入与输出

输出print()函数&#xff1a;print()函数示例如下&#xff1a;>>>print(1)1>>> print(Hello World)Hello World>>> a 1>>> b a>>> print(a,b)1 a扩展部分&#xff1a;(初学不看)回过头来看print()函数的语法&#xff1a;print(…

(上)python3 selenium3 从框架实现代码学习selenium让你事半功倍

本文感谢以下文档或说明提供的参考。 Selenium-Python中文文档 Selenium Documentation Webdriver 参考 如有错误欢迎在评论区指出&#xff0c;作者将即时更改。 环境说明 操作系统&#xff1a;Windows7 SP1 64python 版本&#xff1a;3.7.7浏览器&#xff1a;谷歌浏览器浏览…

剑指offer之滑动窗口的最大值

1 问题 给定一个数组和滑动窗口的大小&#xff0c;请找出所有滑动窗口里的最大值&#xff0c;列如&#xff0c;数组&#xff5b;2,3,4,2,6,2,5,1&#xff5d;的滑动窗口大小是3&#xff0c;一起6个滑动窗口&#xff0c;分别是{4&#xff0c;4&#xff0c;6&#xff0c;6&#…

.NET 7 中的 HostApplicationBuilder

.NET 7 Preview 3 引入的 HostApplicationBuilderIntro在 .NET 6 中&#xff0c;ASP.NET Core 引入了 Minimal API&#xff0c;对于简单的应用使用 Minimal API 我们可以使用非常精简的代码来实现我们的 API&#xff0c;在 .NET 7 Preview 3 中&#xff0c;引入了一个 HostAppl…

SQL Server 2008 R2 Developer Edition图文安装教程

本文主要以截图的方式,详细说明SQL Server 2008 R2 Developer Edition的安装过程。 1、双击安装包中的setup.exe,如下图,点击“安装”→“全新安装或现有安装添加功能”。 2、点击“确定”。 3、点击“下一步”。

计算机应用基础851,最新2020秋广东开放大学计算机应用基础本科上传资料作业2文档(2页)-原创力文档...

Sheet2sheet1姓名迟春艳宋灵辉任慧霞张玉鹏李卫东付祖荣焦中明杨丹妍张积盛王继锋王永隆陶春光刘炳光吕秀涛赵业绵齐晓鹏王晶晶张秀双姜殿琴车延波闫少林李安娜盖玉艳王建东于玲云周琳娜王瑞欣学生成绩表期中成绩期末成绩总成绩籍贯陕西江西河北山东湖南广东上海辽宁北京湖北山…

复利计算评价博客

评价&#xff1a; 201406114202 蔡彩虹&#xff08;1&#xff09; http://www.cnblogs.com/caicaihong/p/5393335.html 201406114207 甘佳萍&#xff08;2&#xff09; http://www.cnblogs.com/gjpg/p/5393501.html 201406114239 赖文亮&#xff08;3&#xff09; http://www.c…

地理模块化施工的优点_模块化建筑适合学校的6个原因

原标题&#xff1a;模块化建筑适合学校的6个原因我们正处于模块化建筑的新时代&#xff0c;学校建筑能从这种创新和有效的建筑方法中受益。最先进的工厂制造——减少制造时间; 提高施工质量; 更具环境可持续性; 减少现场工作和干扰学校的正常作息; 同时在项目期间提供更好的健康…

新款ATM恶意软件Alice 可对抗动态分析 但目前需要物理接触主机

趋势科技&#xff08;Trend Micro&#xff09;安全公司的研究人员警告称&#xff0c;新发现的恶意软件家族主要针对ATM机&#xff08;自动取款机&#xff09;&#xff0c;唯一目的就是要掏空ATM机保险箱里的现金。 alice软件是什么 这款恶意软件被称为“Alice”&#xff0c;是迄…

(下)python3 selenium3 从框架实现代码学习selenium让你事半功倍

上一篇博文简要 在上一篇博文中已得知&#xff1a;使用 execute 向远程服务器发送请求会通过 webdriver 与浏览器交互&#xff0c;且发送已定义的命令常量可获得一些相关信息。 其中 execute 方法实现已经在上一篇博文中有实现说明。并且在我们已经知道 webdriver基类&#x…

剑指offer之翻转单词顺序

1 题目 输入一个英文橘子&#xff0c;翻转句子中的单词顺序&#xff0c;但是单词内字符串的顺序不变&#xff0c;简单起见&#xff0c;标点符号和普通字符字母一样处理&#xff0c;例如输入字符串"I am a student.",则输出"student. a am I" 2 思路 先…