lis

来源:互联网 发布:怎么查看淘宝账号违规 编辑:程序博客网 时间:2024/05/01 06:41

PullToRefreshListView 应用讲解

转载于http://blog.csdn.net/mmjiajia132/article/details/40397813

PullToRefreshListView 用法和ListView 没有什么区别  listview能用的属性 pulltorefresh也能用

我一直认为动手是最好的学习方法...

一:首先看布局文件

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.       
  7.     <!--     ptr:ptrAnimationStyle="flip"  flip:翻转  rotate:旋转-->  
  8.     <!--     ptr:ptrShowIndicator="true"  右上角 右下角出现箭头-->  
  9.     <com.handmark.pulltorefresh.library.PullToRefreshListView  
  10.         xmlns:ptr="http://schemas.android.com/apk/res-auto"  
  11.         android:id="@+id/pullToRefresh"  
  12.         android:layout_width="match_parent"  
  13.         android:layout_height="wrap_content"  
  14.         ptr:ptrDrawable="@drawable/default_ptr_flip"   
  15.         ptr:ptrAnimationStyle="flip"  
  16.         ptr:ptrHeaderBackground="#383838"  
  17.         ptr:ptrHeaderTextColor="#FFFFFF"  
  18.         />  
  19.   
  20. </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查看

二:MainActivity代码

 

  1. public class MainActivity extends ActionBarActivity {  
  2.       
  3.     private PullToRefreshListView pullToRefresh;  
  4.     private List<PullBean> data = new ArrayList<PullBean>();  
  5.     MyAdapter adapter;  
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.         pullToRefresh = (PullToRefreshListView) findViewById(R.id.pullToRefresh);  
  11.         data = getData();  
  12.         adapter = new MyAdapter(this);  
  13.         pullToRefresh.setAdapter(adapter);  
  14.         /* 
  15.          * Mode.BOTH:同时支持上拉下拉 
  16.          * Mode.PULL_FROM_START:只支持下拉Pulling Down 
  17.          * Mode.PULL_FROM_END:只支持上拉Pulling Up 
  18.          */  
  19.         /* 
  20.          * 如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、onPullUpToRefresh()两个方法。  
  21.          * 如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,同时实现onRefresh()方法。 
  22.          * 当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法, 
  23.          * Mode.PULL_FROM的时候只调用onPullUpToRefresh()方法.  
  24.          */  
  25.         pullToRefresh.setMode(Mode.BOTH);  
  26.         init();  
  27.           
  28.         /* 
  29.          * setOnRefreshListener(OnRefreshListener listener):设置刷新监听器; 
  30.          * setOnLastItemVisibleListener(OnLastItemVisibleListener listener):设置是否到底部监听器; 
  31.          * setOnPullEventListener(OnPullEventListener listener);设置事件监听器; 
  32.          * onRefreshComplete():设置刷新完成 
  33.          */  
  34.         /* 
  35.          * pulltorefresh.setOnScrollListener() 
  36.          */  
  37.         // SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动      
  38.         // SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下)      
  39.         // SCROLL_STATE_IDLE(0) 停止滚动         
  40.         /* 
  41.          * setOnLastItemVisibleListener 
  42.          * 当用户拉到底时调用   
  43.          */  
  44.         /* 
  45.          * setOnTouchListener是监控从点下鼠标 (可能拖动鼠标)到放开鼠标(鼠标可以换成手指)的整个过程 ,他的回调函数是onTouchEvent(MotionEvent event), 
  46.          * 然后通过判断event.getAction()是MotionEvent.ACTION_UP还是ACTION_DOWN还是ACTION_MOVE分别作不同行为。 
  47.          * setOnClickListener的监控时间只监控到手指ACTION_DOWN时发生的行为 
  48.          */  
  49.         pullToRefresh.setOnRefreshListener(new OnRefreshListener2<ListView>(){  
  50.             @Override  
  51.             public void onPullDownToRefresh(  
  52.                     PullToRefreshBase<ListView> refreshView) {  
  53.                 // TODO Auto-generated method stub  
  54.                  PullBean bean = new PullBean();  
  55.                  bean.setTitle("下拉刷新");  
  56.                  bean.setContent("我的神");  
  57.                  adapter.addFirst(bean);  
  58.                  new FinishRefresh().execute();  
  59.                  adapter.notifyDataSetChanged();  
  60.             }  
  61.               
  62.             @Override  
  63.             public void onPullUpToRefresh(  
  64.                     PullToRefreshBase<ListView> refreshView) {  
  65.                 // TODO Auto-generated method stub  
  66.                 PullBean bean = new PullBean();  
  67.                 bean.setTitle("上拉刷新");  
  68.                 bean.setContent("我的神");  
  69.                 adapter.addLast(bean);  
  70.                 new FinishRefresh().execute();  
  71.                 adapter.notifyDataSetChanged();  
  72.             }  
  73.         });  
  74.           
  75.       
  76. //      pullToRefresh.setOnRefreshListener(new OnRefreshListener<ListView>() {  
  77. //  
  78. //          @Override  
  79. //          public void onRefresh(PullToRefreshBase<ListView> refreshView) {  
  80. //              // TODO Auto-generated method stub  
  81. //              String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),    
  82. //                        DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);    
  83. //    
  84. //                // Update the LastUpdatedLabel    
  85. //                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);  
  86. //                PullBean bean = new PullBean();  
  87. //                bean.setTitle("我的神");  
  88. //                bean.setContent("我的神");  
  89. //                adapter.addFirst(bean);  
  90. //                new FinishRefresh().execute();  
  91. //          }  
  92. //            
  93. //      });  
  94.     }  
  95.       
  96.     private void init()    
  97.     {    
  98.         ILoadingLayout startLabels = pullToRefresh    
  99.                 .getLoadingLayoutProxy(true, false);    
  100.         startLabels.setPullLabel("下拉刷新...");// 刚下拉时,显示的提示    
  101.         startLabels.setRefreshingLabel("正在载入...");// 刷新时    
  102.         startLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示    
  103.     
  104.         ILoadingLayout endLabels = pullToRefresh.getLoadingLayoutProxy(    
  105.                 false, true);    
  106.         endLabels.setPullLabel("上拉刷新...");// 刚下拉时,显示的提示    
  107.         endLabels.setRefreshingLabel("正在载入...");// 刷新时    
  108.         endLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示    
  109.           
  110. //      // 设置下拉刷新文本  
  111. //      pullToRefresh.getLoadingLayoutProxy(false, true)  
  112. //              .setPullLabel("上拉刷新...");  
  113. //      pullToRefresh.getLoadingLayoutProxy(false, true).setReleaseLabel(  
  114. //              "放开刷新...");  
  115. //      pullToRefresh.getLoadingLayoutProxy(false, true).setRefreshingLabel(  
  116. //              "正在加载...");  
  117. //      // 设置上拉刷新文本  
  118. //      pullToRefresh.getLoadingLayoutProxy(true, false)  
  119. //              .setPullLabel("下拉刷新...");  
  120. //      pullToRefresh.getLoadingLayoutProxy(true, false).setReleaseLabel(  
  121. //              "放开刷新...");  
  122. //      pullToRefresh.getLoadingLayoutProxy(true, false).setRefreshingLabel(  
  123. //              "正在加载...");  
  124.     }    
  125.       
  126.     private List<PullBean> getData(){  
  127.         List<PullBean> list = new ArrayList<PullBean>();  
  128.         for(int i = 0;i < 10;i ++){  
  129.             PullBean bean = new PullBean();  
  130.             bean.setTitle("item " + i + " 搜索业务增速下滑 Google廉颇老矣?");  
  131.             bean.setContent("Google于10月17日发布了2014年第三季度财报");  
  132.             list.add(bean);  
  133.         }  
  134.           
  135.         return list;  
  136.     }  
  137.       
  138.     private class FinishRefresh extends AsyncTask<Void, Void, Void>{    
  139.         @Override    
  140.         protected Void doInBackground(Void... params) {    
  141.              try {    
  142.                  Thread.sleep(1000);    
  143.              } catch (InterruptedException e) {    
  144.              }    
  145.             return null;    
  146.         }    
  147.      
  148.         @Override    
  149.         protected void onPostExecute(Void result){    
  150. //          adapter.notifyDataSetChanged();  
  151.             pullToRefresh.onRefreshComplete();    
  152.         }    
  153.     }    
  154.       
  155.     private class MyAdapter extends BaseAdapter{  
  156.         private LayoutInflater mInflater;  
  157.           
  158.         public MyAdapter(Context context) {  
  159.             // TODO Auto-generated constructor stub  
  160.             mInflater = LayoutInflater.from(context);  
  161.         }  
  162.           
  163.         public void addFirst(PullBean bean){  
  164.             data.add(0, bean);  
  165.         }  
  166.           
  167.         public void addLast(PullBean bean){  
  168.             data.add(bean);  
  169.         }  
  170.           
  171.         @Override  
  172.         public int getCount() {  
  173.             // TODO Auto-generated method stub  
  174.             return data.size();  
  175.         }  
  176.           
  177.         @Override  
  178.         public Object getItem(int position) {  
  179.             // TODO Auto-generated method stub  
  180.             return data.get(position);  
  181.         }  
  182.           
  183.         @Override  
  184.         public long getItemId(int position) {  
  185.             // TODO Auto-generated method stub  
  186.             return 0;  
  187.         }  
  188.           
  189.         @Override  
  190.         public View getView(int position, View convertView, ViewGroup parent) {  
  191.             // TODO Auto-generated method stub  
  192.             ViewHolder viewHolder = null;  
  193.             if(convertView == null){  
  194.                 viewHolder = new ViewHolder();  
  195.                 convertView = mInflater.inflate(R.layout.item, null);  
  196.                 viewHolder.title = (TextView) convertView.findViewById(R.id.title);  
  197.                 viewHolder.content = (TextView) convertView.findViewById(R.id.content);  
  198.                   
  199.                 convertView.setTag(viewHolder);  
  200.             }else{  
  201.                 viewHolder = (ViewHolder) convertView.getTag();  
  202.             }  
  203.               
  204.             viewHolder.title.setText(data.get(position).getTitle());  
  205.             viewHolder.content.setText(data.get(position).getContent());  
  206.               
  207.             return convertView;  
  208.         }  
  209.           
  210.         class ViewHolder{  
  211.             TextView title;  
  212.             TextView content;  
  213.         }  
  214.     }  
  215.   
  216.       
  217.   
  218. }  

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

 

item.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:padding="5dp"  
  6.     android:orientation="vertical" >  
  7.       
  8.     <TextView  
  9.         android:id="@+id/title"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:textSize="18sp"  
  13.         android:textColor="#BA55D3"  
  14.         android:text="我的神"/>  
  15.       
  16.     <TextView   
  17.         android:id="@+id/content"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:textSize="14.0sp"  
  21.         android:layout_marginTop="5dp"  
  22.         android:textColor="#7CFC00"  
  23.         android:text="我的神"/>  
  24. </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>

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

 

  1. ILoadingLayout startLabels = pullToRefresh    
  2.          .getLoadingLayoutProxy(true, false);    
  3.  startLabels.setPullLabel("下拉刷新...");// 刚下拉时,显示的提示    
  4.  startLabels.setRefreshingLabel("正在载入...");// 刷新时    
  5.  startLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示    
  6.   
  7.  ILoadingLayout endLabels = pullToRefresh.getLoadingLayoutProxy(    
  8.          false, true);    
  9.  endLabels.setPullLabel("上拉刷新...");// 刚下拉时,显示的提示    
  10.  endLabels.setRefreshingLabel("正在载入...");// 刷新时    
  11.  endLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示    

 

当然也可以这样

 

  1.              pullToRefresh.getLoadingLayoutProxy(false, true)  
  2.         .setPullLabel("上拉刷新...");  
  3. pullToRefresh.getLoadingLayoutProxy(false, true).setReleaseLabel(  
  4.         "放开刷新...");  
  5. pullToRefresh.getLoadingLayoutProxy(false, true).setRefreshingLabel(  
  6.         "正在加载...");  
  7. // 设置上拉刷新文本  
  8. pullToRefresh.getLoadingLayoutProxy(true, false)  
  9.         .setPullLabel("下拉刷新...");  
  10. pullToRefresh.getLoadingLayoutProxy(true, false).setReleaseLabel(  
  11.         "放开刷新...");  
  12. pullToRefresh.getLoadingLayoutProxy(true, false).setRefreshingLabel(  
  13.         "正在加载...");  

 

 

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

 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

参考博客:

http://blog.csdn.net/lmj623565791/article/details/38238749

http://blog.csdn.net/harvic880925/article/details/17680305

谢谢原作者

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 福林和娘亲共赴云雨 玉玉米米地地日日刘寡 玉米地和娘的民儿 慢点 民儿和娘玉米地的故事 第2段 民儿和娘在玉米地热逼 玉米地民儿与娘故事全文下载 玉米地娘和儿怀子小说 娘亲祖母共夫全集 小说下载 奶奶王珍珠怀孕txt 红高粱九儿玉米地视频 娘亲怀了我的种 民儿和娘玉米地故事 快抽出去外婆会怀孕的 民儿玉米地妈全给你 民儿和娘玉米地的小说 第章母亲播种危险期怀孕 儿子今晚后妈随便你怎么弄说说 同学说要看我骑他妈我说可以 荒村野性全文阅读目录 小成和后妈全文免费阅读文章 小诚和后妈全文免费阅读 娘亲在玉米地河边 我和娘亲玉米 娘亲给儿生个娃大结局 在玉米地插娘亲短文 在玉米地插娘亲电影 王来地里与娘激战2 在玉米地插娘亲播放 孩子别谢了我是你妈 臭小子 别急妈咪又不是不给你 粉嫩娘亲全文阅读全文 你的好粗妈v好痛 乡村孽缘上了王雪琴101一0 乡村小神医之情缠玉米地 乡村孽缘长篇小说全文免费阅读 乡村孽缘王雪琴怀孕是第几章 桃花村傻牛李大根 拨出来你爸要来 一个山村全家小说全集 乡村孽缘胡秀`小说全集 儿子小点声别让你爸听见长篇小说