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

pullToRefresh下拉刷新上拉加载相关推荐

  1. Android ListView 实现下拉刷新上拉加载

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/39965327 1.简介 无疑,在Android开发中,ListView是使用非常频 ...

  2. Android 下拉刷新上拉加载 多种应用场景 超级大放送(上)

    转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这 ...

  3. Flutter开发之ListView下拉刷新上拉加载更多(35)

    在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...

  4. 下拉加载 实现 java_[Java教程]iscroll5实现一个下拉刷新上拉加载的效果

    [Java教程]iscroll5实现一个下拉刷新上拉加载的效果 0 2016-08-24 15:00:08 直接上代码!!! * { margin: 0; padding: 0; } ul, li { ...

  5. 小程序在父组件执行子组件方法,可适用于下拉刷新上拉加载之后执行子组件方法

    当父组件引用了子组件的时候,会遇到父组件执行子组件的方法,比如下拉刷新上拉加载等事件只有在页面中才能检测到,但是获取数据的方法在子组件,这时就可以执行子组件方法. 思路很简单,类似于vue中给子组件加 ...

  6. 分享轮子-flutter下拉刷新上拉加载

    flutter下拉上拉组件轮子 什么是flutter? 首先说下flutter,估计这个应该挺多人没听过flutter这个框架,它是一个google推出的跨平台的移动应用UI框架,和React Nat ...

  7. 使用MJRefresh自定义下拉刷新,上拉加载动画

    有时候我们需要自己设置下拉刷新,上拉加载动画的实现,这里主要是记录下使用MJRefresh自定义下拉刷新,上拉加载动画..... 下拉刷新我们只需要继承MJRefreshGifHeader即可: 实现 ...

  8. android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多

    [1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...

  9. react-native 自定义 下拉刷新 / 上拉加载更多 组件

    1.封装 Scroller 组件 src/components/Scroller/index.js /*** 下拉刷新/上拉加载更多 组件(Scroller)*/ import React, {Com ...

  10. android 列表上拉加载更多,Android 下拉刷新,上拉加载更多控件–支持ListView,GridView和ScrollView...

    麦洛遇到这样一个需求,实现类似于IOS下拉刷新,上拉加载更多的控件.麦洛google,baidu了一番,网上有不少实现,比较常见的是国外牛人的实现,不过国外的实现基本上都是扩展于ListView,所以 ...

最新文章

  1. poj 1306 Combinations
  2. bzoj 3209 数位DP+欧拉定理
  3. 为什么你的用户总是不满意?
  4. sqlserver存储过程的参数传递注意事项
  5. UpdateProgress 控件--用户中断
  6. 用500行纯前端代码在浏览器中构建一个Tableau
  7. C# Task 循环任务_C# Task.Run调用外部参数
  8. OJ1042: 数列求和3(递推思想)
  9. mac 删除文件夹里所有的.svn文件
  10. 移动硬盘坏点测试软件,移动硬盘坏道检测修复
  11. 前端7大常用布局方式
  12. 《大数据》2022年第4期目次摘要
  13. 提升自我的42个实用技巧
  14. java虚拟机栈(亦篇足以,吴懈可击)
  15. Redis单线程和多线程
  16. 方便实用的串口调试工具/串口调试助手/串口精灵 (工具一)
  17. Android wifi carlife,CarLife 可以通过WIFI和Android
  18. Tita 持续绩效:一对一会议的好处
  19. 人脸检测颜值软件_百度AI人脸识别测颜值源码
  20. [Unity优化]减少顶点数目

热门文章

  1. java异常日志不要只打一半,要输出全部错误信息
  2. mysql使用DISTINCT进行去重
  3. linux的less命令如何退出,Linux命令详解之less命令
  4. Qt 进程使用 使用当前进程启动另外进程
  5. 量子计算机到底神在哪里说明文,刘露《神奇的量子通信》初中说明文阅读及答案...
  6. 硬件知识:U盘缩水是怎么回事,如何恢复U盘真实容量?
  7. 数据库恢复相关知识笔记
  8. 家里网线的接法和顺序
  9. java获取用户地理位置_java web 通过ip获取当前地理位置
  10. Vmware Centos中安装vmtools工具