开源地址: https://github.com/chrisbanes/Android-PullToRefresh

简单介绍:PullToRefresh是一款支持ListView,GridView,ViewPager,ScrollView,WebView等一切能够拖动,并实现上下左右拖动刷新数据的框架,废话不多说,上代码;

[主要的android依赖项目存放在library中,支持fragment列表,ViewPager列表的存放在extras包中]

[依赖项目导入如左图]

1.支持ListView的实现:

1)XML实现

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5.  
  6. <com.handmark.pulltorefresh.library.PullToRefreshListView
  7. android:id="@+id/my_ptr_lv"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:cacheColorHint="#0000"
  11. android:divider="#0FF"
  12. android:dividerHeight="1dp"
  13. android:smoothScrollbar="true"
  14. android:fastScrollEnabled="false"
  15. android:footerDividersEnabled="false"
  16. android:headerDividersEnabled="false" />
  17.  
  18. </RelativeLayout>

2)JAVA代码

  1. public class PullListSampleActivity extends Activity {
  2.  
  3. private PullToRefreshListView mPullToRefreshLv;
  4. private ArrayAdapter<String> mAdapter;
  5. private LinkedList<String> mListItems;
  6.  
  7. private String[] mStrings = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
  8. "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
  9. "Allgauer Emmentaler", "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
  10. "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
  11. "Allgauer Emmentaler" };
  12.  
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_pull_list_sample);
  17. //填充数据
  18. mPullToRefreshLv=(PullToRefreshListView) findViewById(R.id.my_ptr_lv);
  19. mListItems=new LinkedList<String>(Arrays.asList(mStrings));
  20. mAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,mListItems);
  21. mPullToRefreshLv.setAdapter(mAdapter);
  22. //下拉刷新的声音支持
  23. SoundPullEventListener<ListView> soundPullEventListener=new SoundPullEventListener<ListView>(this);
  24. soundPullEventListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event);
  25. soundPullEventListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound);
  26. soundPullEventListener.addSoundEvent(State.RESET, R.raw.reset_sound);
  27. mPullToRefreshLv.setOnPullEventListener(soundPullEventListener);
  28. //刷新时调用的监听器
  29. mPullToRefreshLv.setOnRefreshListener(new OnRefreshListener<ListView>() {
  30.  
  31. @Override
  32. public void onRefresh(PullToRefreshBase<ListView> refreshView) {
  33.  
  34. String label=DateUtils.formatDateTime(PullListSampleActivity.this, System.currentTimeMillis(),
  35. DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
  36. //设置头部Label
  37. mPullToRefreshLv.getLoadingLayoutProxy().setLastUpdatedLabel(label);
  38. new GetListDataTask().execute();
  39. }
  40.  
  41. });
  42.  
  43. mPullToRefreshLv.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
  44.  
  45. @Override
  46. public void onLastItemVisible() {
  47. Toast.makeText(PullListSampleActivity.this,"all data loaded !", 800).show();
  48.  
  49. }
  50.  
  51. });
  52. }
  53.  
  54. class GetListDataTask extends AsyncTask<Void, Void, String[]>{
  55.  
  56. @Override
  57. protected String[] doInBackground(Void... params) {
  58. //mock get datas
  59. try {
  60. Thread.sleep(3000);
  61. } catch (InterruptedException e) {
  62. e.printStackTrace();
  63. }
  64. return mStrings;
  65. }
  66.  
  67. @Override
  68. protected void onPostExecute(String[] result) {
  69. mListItems.addAll(Arrays.asList(result));
  70. mAdapter.notifyDataSetChanged();
  71. //手动关闭头部
  72. mPullToRefreshLv.onRefreshComplete();
  73.  
  74. super.onPostExecute(result);
  75. }
  76.  
  77. }
  78. }

2.支持GridView

1)XML实现

ptr:ptrMode="both"表示上下/左右都能够刷新

ptr:ptrDrawable表示刷新时显示的图标

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5.  
  6. <com.handmark.pulltorefresh.library.PullToRefreshGridView
  7. xmlns:ptr="http://schemas.android.com/apk/res-auto"
  8. android:id="@+id/my_ptr_gv"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. android:cacheColorHint="#0000"
  12. android:divider="#0FF"
  13. android:dividerHeight="1dp"
  14. android:smoothScrollbar="true"
  15. android:fastScrollEnabled="false"
  16. android:footerDividersEnabled="false"
  17. android:headerDividersEnabled="false"
  18. android:numColumns="auto_fit"
  19. ptr:ptrMode="both"
  20. ptr:ptrDrawable="@drawable/default_ptr_rotate" />
  21.  
  22. </RelativeLayout>

2)JAVA代码实现

  1. public class PullGridSampleActivity extends Activity {
  2.  
  3. private PullToRefreshGridView mPullToRefreshGridView;
  4. private ArrayAdapter<String> mAdapter;
  5. private LinkedList<String> mListItems;
  6. private String[] mStrings = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
  7. "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
  8. "Allgauer Emmentaler" };
  9.  
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_pull_grid_sample);
  14.  
  15. mPullToRefreshGridView=(PullToRefreshGridView) findViewById(R.id.my_ptr_gv);
  16. mListItems=new LinkedList<String>();
  17. mAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
  18. android.R.id.text1,mListItems);
  19. mPullToRefreshGridView.setAdapter(mAdapter);
  20.  
  21. //支持当没有数据的时候替代的View 详细代码依据自己的业务
  22. TextView textView=new TextView(this);
  23. LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
  24. params.gravity=Gravity.CENTER;
  25. textView.setLayoutParams(params);
  26. textView.setText("The data is empty !");
  27. mPullToRefreshGridView.setEmptyView(textView);
  28.  
  29. SoundPullEventListener<GridView> pullEventListener=new SoundPullEventListener<GridView>(this);
  30. pullEventListener.addSoundEvent(State.PULL_TO_REFRESH,R.raw.pull_event);
  31. pullEventListener.addSoundEvent(State.RESET,R.raw.reset_sound);
  32. pullEventListener.addSoundEvent(State.REFRESHING,R.raw.refreshing_sound);
  33. mPullToRefreshGridView.setOnPullEventListener(pullEventListener);
  34.  
  35. mPullToRefreshGridView.setOnRefreshListener(new OnRefreshListener2<GridView>() {
  36.  
  37. @Override
  38. public void onPullDownToRefresh(
  39. PullToRefreshBase<GridView> refreshView) {
  40. String label=DateUtils.formatDateTime(getApplicationContext(),
  41. System.currentTimeMillis(),DateUtils.FORMAT_24HOUR);
  42. refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
  43. new GetDataTask().execute();
  44. }
  45.  
  46. @Override
  47. public void onPullUpToRefresh(
  48. PullToRefreshBase<GridView> refreshView) {
  49. String label=DateUtils.formatDateTime(getApplicationContext(),
  50. System.currentTimeMillis(),DateUtils.FORMAT_24HOUR);
  51. refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
  52. new GetDataTask().execute();
  53. }
  54.  
  55. });
  56.  
  57. }
  58.  
  59. class GetDataTask extends AsyncTask<Void, Void, String[]>{
  60.  
  61. @Override
  62. protected String[] doInBackground(Void... params) {
  63. try {
  64. Thread.sleep(2000);
  65. } catch (InterruptedException e) {
  66. e.printStackTrace();
  67. }
  68. return mStrings;
  69. }
  70.  
  71. @Override
  72. protected void onPostExecute(String[] result) {
  73. mListItems.addAll(Arrays.asList(result));
  74. mAdapter.notifyDataSetChanged();
  75.  
  76. mPullToRefreshGridView.onRefreshComplete();
  77.  
  78. }
  79.  
  80. }
  81.  
  82. }

3.对ViewPager的实现

1)XML

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5.  
  6. <com.handmark.pulltorefresh.extras.viewpager.PullToRefreshViewPager
  7. xmlns:ptr="http://schemas.android.com/apk/res-auto"
  8. android:id="@+id/my_ptr_viewpager"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. ptr:ptrAnimationStyle="flip"
  12. ptr:ptrMode="both"
  13. ptr:ptrHeaderBackground="#FFFF" />
  14.  
  15. </RelativeLayout>

2)Java实现

  1. public class PullViewPagerSample extends Activity implements OnRefreshListener<ViewPager>{
  2.  
  3. private PullToRefreshViewPager mPullToRefreshViewPager;
  4.  
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_pull_viewpager_sample);
  9.  
  10. mPullToRefreshViewPager=(PullToRefreshViewPager) findViewById(R.id.my_ptr_viewpager);
  11.  
  12. mPullToRefreshViewPager.getRefreshableView().setAdapter(new MyPagerAdapter());
  13. mPullToRefreshViewPager.setOnRefreshListener(this);
  14.  
  15. }
  16.  
  17. class MyPagerAdapter extends PagerAdapter{
  18.  
  19. private final int[] sDrawables = { R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper,
  20. R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper };
  21.  
  22. @Override
  23. public int getCount() {
  24. return sDrawables.length;
  25. }
  26.  
  27. @Override
  28. public Object instantiateItem(ViewGroup container, int position) {
  29. ImageView imageView=new ImageView(container.getContext());
  30. imageView.setImageResource(sDrawables[position]);
  31. container.addView(imageView,LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
  32. return imageView;
  33. }
  34.  
  35. @Override
  36. public boolean isViewFromObject(View arg0, Object arg1) {
  37. return arg0==(View)arg1;
  38. }
  39.  
  40. @Override
  41. public void destroyItem(ViewGroup container, int position, Object object) {
  42. container.removeView((View) object);
  43. }
  44.  
  45. }
  46.  
  47. @Override
  48. public void onRefresh(PullToRefreshBase<ViewPager> refreshView) {
  49. try {
  50. Thread.sleep(4000);//模拟载入时间
  51. } catch (InterruptedException e) {
  52. e.printStackTrace();
  53. }
  54. mPullToRefreshViewPager.onRefreshComplete();
  55. }
  56.  
  57. }

Android开源--PullToRefresh的更多相关文章

  1. Android开源项目pulltorefresh分析与简单使用

    在Android开发中有时我们须要訪问网络实时刷新数据.比方QQ好友在线状态最新信息,QQ空间须要显示很多其它的好友动态信息,EOE论坛client显示很多其它的文章帖子信息等.android-pul ...

  2. 2015-2016最火的Android开源项目--github开源项目集锦(不看你就out了)

    标签: Android开发开源项目最火Android项目github 2015-2016最火的Android开源项目 本文整理与集结了近期github上使用最广泛最火热与最流行的开源项目,想要充电与提 ...

  3. Android开源项目分类汇总

    目前包括: Android开源项目第一篇——个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...

  4. 59.Android开源项目及库 (转)

    转载 : https://github.com/Tim9Liu9/TimLiu-Android?hmsr=toutiao.io&utm_medium=toutiao.io&utm_so ...

  5. Android 开源项目分类汇总(转)

    Android 开源项目分类汇总(转) ## 第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Galler ...

  6. Android 开源项目分类汇总

    Android 开源项目分类汇总 Android 开源项目第一篇——个性化控件(View)篇  包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView ...

  7. Android开源项目及库搜集

    TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending,github搜索:https://github.com/ ...

  8. material design 的android开源代码整理

    material design 的android开源代码整理 1 android (material design 效果的代码库) 地址请点击:MaterialDesignLibrary 效果: 2 ...

  9. Android开源项目库汇总

    最近做了一个Android开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. 抽 ...

随机推荐

  1. android 使用 LocalStorage

    PS:本身是.net 出身 因为项目需要 研究了好几天安卓 这个方法网上也有 自己也写出来 有时间自己看看 和 给还没有解决问题的朋友借鉴下,下面有标个重点 是允许使用localstorage 的关键 ...

  2. J.U.C并发框架源码阅读(十)ConcurrentLinkedQueue

    基于版本jdk1.7.0_80 java.util.concurrent.ConcurrentLinkedQueue 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL ...

  3. vi / vim 设置

    一.vi下方向键输入后,出现ABCD,解决方法: 在vi中输入:set nocp 按回车即可. 二.设置TAB缩进4个空格: 为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方 ...

  4. 51nod 1095 Anigram单词【hash/map/排序/字典树】

    1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b ...

  5. JSONP 安全攻防技术(JSON劫持、 XSS漏洞)

    关于 JSONP JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案.他实现的基本原理是利用了 HTML 里 <script&g ...

  6. MySQL索引,MySQL性能分析及explain的使用,分析SQL查询性能

    可以使用explain来分析MySQL查询性能,举例如下: 1.使用explain语句去查看分析结果 如 explain select * from test1 where id=1; 会出现: id ...

  7. linux之ls指令的关键字过滤显示

    假设~/admin的文件夹下面有几个文件: a.pm b.pm c.pl d.pl e.pml 想只显示.pm结尾的可以用: ls *.pm 或者 ls | grep .pm,两者等价. 想显示b.开 ...

  8. ubifs & mtd

    前天晚上在写完另一篇总结之时,赵XX向我咨询了关于mtd 和ubifs的相关内容.而我在这方面只是略懂皮毛,所以向他许愿共同调查这个方面的知识.经过昨天一天的调查,最后感觉是有了一定的经验和基础了,所 ...

  9. 【mybatis】mybatis中 的# 和 $的区别

    mybatis中 的# 和 $的区别 参考地址:https://www.cnblogs.com/sxdcgaq8080/p/10869144.html

  10. 高并发下的Node.js与负载均衡

    新兴的Node.js已经吸引了很多开发人员的眼光,它提供给我们一个快速构建高性能的网络应用的平台.我也开始逐步投入node.js的怀抱,在学习和使用的过程中,遇到了一些问题,也有一些经验,我觉得有必要 ...