前言:前几天写了篇关于PullToRefresh控件的DEMO导入的博客,但由于当时没有用到,所以就没细往下讲,现在开始到了实战阶段,用到了PullToRefresh的listView样式,网上有讲的,但讲的不多,而且没有详细的例子来说,下面我讲讲这个东东的实现方法。这个例子对应PullToRefreshDemo里的第一个选项ListView;

注意:本篇仅写的如何实现下拉刷新,对于上拉加载的问题,参见《使用PullToRefresh实现下拉刷新和上拉加载》

相关文章:

1、《List控件使用--SimpleAdapter使用详解(一)

2、《List控件使用--SimpleAdapter使用详解(二)

3、《PullToRefresh使用详解(二)---重写BaseAdapter实现复杂XML下拉刷新》

4、《PullToRefresh使用详解(三)--实现异步加载的下拉刷新列表》

5、《PullToRefresh使用详解(四)--利用回调函数实现到底加载》

6、《PullToRefresh使用详解(五)--下拉刷新的ScrollView》

效果图: 

                               正在刷新                                                                       刷新后

      

一、导入Library

下载源码后(https://github.com/chrisbanes/Android-PullToRefresh),里面有个Library工程,添加工程到Eclipse中;

另外extras文件夹还有两个工程:PullToRefreshListFragment和PullToRefreshViewPager,由于我们的这个用不到他们的库文件,所以不必导入了;

二、实战

1、新建工程,添加Libray库到工程中

新建工程(try_PullToRefresh)后,右键-》Properties-》Android-》Add  选择上面的Library,然后就是这个样子的

2、重写activity_main.xml

XML内容为:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <!--     The PullToRefreshListView replaces a standard ListView widget. -->
  7. <com.handmark.pulltorefresh.library.PullToRefreshListView
  8. android:id="@+id/pull_refresh_list"
  9. android:layout_width="fill_parent"
  10. android:layout_height="fill_parent"
  11. android:cacheColorHint="#00000000"
  12. android:divider="#19000000"
  13. android:dividerHeight="4dp"
  14. android:fadingEdge="none"
  15. android:fastScrollEnabled="false"
  16. android:footerDividersEnabled="false"
  17. android:headerDividersEnabled="false"
  18. android:smoothScrollbar="true" />
  19. </LinearLayout>

其中中间那一大段<com.handmark.pull………………/>就是相当于ListView控件,用这段来代替原是ListView控件的代码

3、JAVA代码讲解

全部代码:

  1. package com.example.try_pulltorefresh;
  2. import java.util.Arrays;
  3. import java.util.LinkedList;
  4. import com.handmark.pulltorefresh.library.PullToRefreshBase;
  5. import com.handmark.pulltorefresh.library.PullToRefreshListView;
  6. import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
  7. import android.os.AsyncTask;
  8. import android.os.Bundle;
  9. import android.app.Activity;
  10. import android.text.format.DateUtils;
  11. import android.widget.ArrayAdapter;
  12. import android.widget.ListView;
  13. public class MainActivity extends Activity {
  14. private String[] mStrings = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
  15. "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
  16. "Allgauer Emmentaler", "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
  17. "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
  18. "Allgauer Emmentaler" };
  19. private LinkedList<String> mListItems;
  20. private PullToRefreshListView mPullRefreshListView;
  21. private ArrayAdapter<String> mAdapter;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
  27. // Set a listener to be invoked when the list should be refreshed.
  28. mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
  29. @Override
  30. public void onRefresh(PullToRefreshBase<ListView> refreshView) {
  31. String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
  32. DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
  33. // Update the LastUpdatedLabel
  34. refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
  35. // Do work to refresh the list here.
  36. new GetDataTask().execute();
  37. }
  38. });
  39. mListItems = new LinkedList<String>();
  40. mListItems.addAll(Arrays.asList(mStrings));
  41. mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);
  42. //这两个绑定方法用其一
  43. // 方法一
  44. //       mPullRefreshListView.setAdapter(mAdapter);
  45. //方法二
  46. ListView actualListView = mPullRefreshListView.getRefreshableView();
  47. actualListView.setAdapter(mAdapter);
  48. }
  49. private class GetDataTask extends AsyncTask<Void, Void, String> {
  50. //后台处理部分
  51. @Override
  52. protected String doInBackground(Void... params) {
  53. // Simulates a background job.
  54. try {
  55. Thread.sleep(1000);
  56. } catch (InterruptedException e) {
  57. }
  58. String str="Added after refresh...I add";
  59. return str;
  60. }
  61. //这里是对刷新的响应,可以利用addFirst()和addLast()函数将新加的内容加到LISTView中
  62. //根据AsyncTask的原理,onPostExecute里的result的值就是doInBackground()的返回值
  63. @Override
  64. protected void onPostExecute(String result) {
  65. //在头部增加新添内容
  66. mListItems.addFirst(result);
  67. //通知程序数据集已经改变,如果不做通知,那么将不会刷新mListItems的集合
  68. mAdapter.notifyDataSetChanged();
  69. // Call onRefreshComplete when the list has been refreshed.
  70. mPullRefreshListView.onRefreshComplete();
  71. super.onPostExecute(result);
  72. }
  73. }
  74. }

代码讲解:
1、变量定义

  1. private LinkedList<String> mListItems;    //显示的列表对应原字符串
  2. private PullToRefreshListView mPullRefreshListView;  //PullToRefreshListView实例
  3. private ArrayAdapter<String> mAdapter;  //ListView的适配器

2、在OnCreate()中主要分为两步
(1)初始化mPullRefreshListView并设置监听器,以执行当需要刷新时,应该怎么办,至于真正执行刷新的类GetDataTask()我们后面再细讲,对应代码为:

  1. mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
  2. // Set a listener to be invoked when the list should be refreshed.
  3. mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
  4. @Override
  5. public void onRefresh(PullToRefreshBase<ListView> refreshView) {
  6. String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
  7. DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
  8. // Update the LastUpdatedLabel
  9. refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
  10. // Do work to refresh the list here.
  11. new GetDataTask().execute();
  12. }
  13. });

(2)设置适配器列表内容,并与ListView绑定以显示出来,对应代码为:

  1. //设置列表内容
  2. mListItems = new LinkedList<String>();
  3. mListItems.addAll(Arrays.asList(mStrings));
  4. mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);
  5. //这两个绑定方法用其一
  6. // 方法一
  7. //       mPullRefreshListView.setAdapter(mAdapter);
  8. //方法二
  9. ListView actualListView = mPullRefreshListView.getRefreshableView();
  10. actualListView.setAdapter(mAdapter);

3、执行刷新的类GetDataTask()
先贴出这段代码来:

  1. private class GetDataTask extends AsyncTask<Void, Void, String> {//定义返回值的类型
  2. // 后台处理部分
  3. @Override
  4. protected String doInBackground(Void... params) {
  5. // Simulates a background job.
  6. try {
  7. Thread.sleep(1000);
  8. } catch (InterruptedException e) {
  9. }
  10. String str="Added after refresh...I add";
  11. return str;
  12. }
  13. //这里是对刷新的响应,可以利用addFirst()和addLast()函数将新加的内容加到LISTView中
  14. //根据AsyncTask的原理,onPostExecute里的result的值就是doInBackground()的返回值
  15. @Override
  16. protected void onPostExecute(String result) {
  17. //在头部增加新添内容
  18. mListItems.addFirst(result);
  19. //通知程序数据集已经改变,如果不做通知,那么将不会刷新mListItems的集合
  20. mAdapter.notifyDataSetChanged();
  21. // Call onRefreshComplete when the list has been refreshed.
  22. mPullRefreshListView.onRefreshComplete();
  23. super.onPostExecute(result);//这句是必有的,AsyncTask规定的格式
  24. }
  25. }

(1)派生自AsyncTask

由于派生自AsyncTask,所以下面的那个函数doInBackground和onPostExecute就不难理解了,这两个函数是AsyncTask必须是重写的两个函数
(2)doInBackground函数

doInBackground执行要于后台执行的语句,返回的值可以是任意类型,但要提前在extends AsyncTask<Void, Void, String> 中定义,这个返回值会做为onPostExecute的参数result传到onPostExecute函数中;如果对于网络访问程序,doInBackground就执行访问网络的代码,然后讲返回值存在result中传给onPostExecute函数,以刷新列表;

(3)onPostExecute函数

onPostExecute()是对返回的值进行操作,并添加到ListView的列表中,有两种添加方式添加到头部----mListItems.addFirst(result);和添加在尾部----mListItems.addLast(result);

至于 AsyncTask,下面是几个网页,讲的还可以,大家可以参考下:

《android AsyncTask 详解》:http://www.eoeandroid.com/thread-168004-1-1.html

《android AsyncTask 详解》(同名):http://blog.csdn.net/dabizime/article/details/6695705

《android之AsyncTask》:http://blog.csdn.net/singwhatiwanna/article/details/9272195

《Android源码分析--带你认识不一样的AsyncTask》:http://blog.csdn.net/singwhatiwanna/article/details/17596225 (绝对精品)

 另外:

1、设置向上拉刷新还是向下拉刷新的代码:

mPullRefreshListView.setMode(Mode.PULL_FROM_END);//向下拉刷新

mPullRefreshListView.setMode(Mode.PULL_FROM_START);//向上拉刷新

mPullRefreshListView.setMode(Mode.BOTH);//两端刷新

注意:这只是一个精简版,在源码中还有一些可借签的代码,可以在看懂这个以后,可以回过头来再看看源码,我相信肯定会有收获的。

源码来啦:http://download.csdn.net/detail/harvic880925/6788247(不要分,仅供分享)

 

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/17680305

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

PullToRefresh使用详解(一)--构建下拉刷新的listView的更多相关文章

  1. 84、PullToRefresh使用详解

    PullToRefresh使用详解(一)--构建下拉刷新的listView http://blog.csdn.net/harvic880925/article/details/17680305 Pul ...

  2. PullToRefresh下拉刷新 加载更多 详解 +示例

    常用设置 项目地址:https://github.com/chrisbanes/Android-PullToRefresh a. 设置刷新模式 如果Mode设置成Mode.PULL_FROM_STAR ...

  3. pullToRefresh下拉刷新上拉加载

    PullToRefresh 是一个第三方的工程. 之前的自定义下拉刷新控件貌似不太好用,于是网上找了这个. 参考:http://www.cnblogs.com/summers/p/4343964.ht ...

  4. 安卓开发笔记——关于开源组件PullToRefresh实现下拉刷新和上拉加载(一分钟搞定,超级简单)

    前言 以前在实现ListView下拉刷新和上拉加载数据的时候都是去继承原生的ListView重写它的一些方法,实现起来非常繁杂,需要我们自己去给ListView定制下拉刷新和上拉加载的布局文件,然后添 ...

  5. 安卓---下拉刷新---上拉加载---解决导入library等自生成库文件失败的问题

    本文的下拉刷新以及上拉加载都是用PullToRefresh实现的,关于PullToRefresh的介绍以及源码,网上可以找到很多,本人在此不再赘述. PullToRefresh是一套实现非常好的下拉刷 ...

  6. Android自定义控件之仿美团下拉刷新

    美团的下拉刷新分为三个状态: 第一个状态为下拉刷新状态(pull to refresh),在这个状态下是一个绿色的椭圆随着下拉的距离动态改变其大小. 第二个部分为放开刷新状态(release to r ...

  7. Android自定义之ScrollView下拉刷新

    公司项目,需要用到ScrollView的下拉刷新,一开始使用的时候PullToRefresh三方库的下拉刷新,我比较纠结第三档库,很强大,但是,公司项目的需求,PullToRefresh就不能做到了, ...

  8. Android之自定义控件-下拉刷新

    实现效果: 图片素材:         --> 首先, 写先下拉刷新时的刷新布局 pull_to_refresh.xml: <resources> <string name=& ...

  9. [转]Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

    版权声明:本文出自郭霖的博客,转载必须注明出处. 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9255575 最近项目中需要用到L ...

随机推荐

  1. HDU 6319.Problem A. Ascending Rating-经典滑窗问题求最大值以及COUNT-单调队列 (2018 Multi-University Training Contest 3 1001)

    2018 Multi-University Training Contest 3 6319.Problem A. Ascending Rating 题意就是给你长度为k的数列,如果数列长度k<n ...

  2. 设置每个datanode里面的map数目,提高运行效率

    首先可以通过hdfs.site.xml下面的dfs.block.size来设置数据的块大小,这个参数会决定map的总数目(4194304=4m) 然后通过mapred.site.xml下面的mapre ...

  3. linux中MySQL本地可以连接,远程连接不上问题

    1.网络或防火墙问题 (1)检查网络直接ping你的远程服务器,ping 182.61.22.107,可以ping通说明网络没问题 (2)看端口号3306是不是被防火墙挡住了,telnet 182.6 ...

  4. [BZOJ4772]显而易见的数论(数论)

    4772: 显而易见的数论 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 76  Solved: 32[Submit][Status][Discuss ...

  5. 【动态规划】【记忆化搜索】CODEVS 1010 过河卒 2002年NOIP全国联赛普及组

    f(i,j)=f(i-1,j)+f(i,j-1),显然可以暴力递归求解,但是很多重复的状态,所以可以记忆下来. 注意障碍点和边界的特判. #include<cstdio> #include ...

  6. BUG The user specified as a definer ('root'@'%') does not exist' in

    BUG描述:通过点击实现页面无刷新提交数据. 链接服务器数据库时-提交成功 当把数据库下载到本地后链接,提交失败 查看日志显示:The user specified as a definer ('ro ...

  7. IO流--FileReader&&FileWriter

    (一)FileReader (1)第一种读取方式 package com.songyan.fileReader; import java.io.FileNotFoundException; impor ...

  8. Java下List<Long>转List<String>或者List<Long>转List<Integer>

    说明:很遗憾,没有快速方法,只能遍历然后循环增加进去. 方法: for(String str : list) { int i = Integer.paseInt(str); intList.add(i ...

  9. Android应用内 代码截屏(获取View快照)和 禁止截屏

    1. 应用内的代码截屏(获取View的快照) Android的View类中提供了获取控件绘制缓存的方法,这种截屏的方式仅限于应用内自己的Activity界面,不需要任何权限,严格来说该方法不属于截屏, ...

  10. android加密解密完美教程

    经常使用加密算法:DES.3DES.RC4.AES,RSA等; 对称加密:des,3des,aes 非对称加密:rsa 不可逆加密:md5 加密模式:ECB.CBC.CFB.OFB等; 填充模式:No ...