(转)【Android - 框架】之刷新加载框架Ultra-Pull-To-Refresh的使用

原地址:http://blog.csdn.net/itgungnir/article/details/53433487


        Ultra-Pull-To-Refresh框架是用来嵌套其他布局,实现下拉刷新和上拉加载的框架。它其中可以嵌套任何控件,ListView、GridView、ScrollView、RecyclerView,甚至TextView。

        这个框架在GitHub上的地址:【Ultra-Pull-To-Refresh-With-Load-More】


(1)首先需要导入框架依赖:

[plain]  view plain  copy
  1. // Ultra-Pull-To-Refresh框架的依赖  
  2. compile 'in.srain.cube:ptr-load-more:1.0.6'  
(2)在XML文件中使用:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!--  
  3.     ptr:ptr_duration_to_close_either:头部和底部回弹时间  
  4.     ptr:ptr_keep_header_when_refresh:刷新过程中是否保留头部  
  5.     ptr:ptr_pull_to_fresh:下拉刷新/释放刷新,默认是释放刷新  
  6.     ptr:ptr_ratio_of_header_height_to_refresh:触发刷新时移动的位置比例,指的是与头部的比例  
  7.     ptr:ptr_resistance:阻尼系数,越大下拉越吃力  
  8. -->  
  9. <in.srain.cube.views.ptr.PtrClassicFrameLayout  
  10.     xmlns:android="http://schemas.android.com/apk/res/android"  
  11.     xmlns:ptr="http://schemas.android.com/apk/res-auto"  
  12.     android:id="@+id/ptr_layout"  
  13.     android:layout_width="match_parent"  
  14.     android:layout_height="match_parent"  
  15.     ptr:ptr_duration_to_close_either="1000"  
  16.     ptr:ptr_keep_header_when_refresh="true"  
  17.     ptr:ptr_pull_to_fresh="false"  
  18.     ptr:ptr_ratio_of_header_height_to_refresh="1.2"  
  19.     ptr:ptr_resistance="1.7">  
  20.   
  21.     <ListView  
  22.         android:id="@+id/id_main_lv_lv"  
  23.         android:layout_width="match_parent"  
  24.         android:layout_height="match_parent" />  
  25. </in.srain.cube.views.ptr.PtrClassicFrameLayout>  
(3)MainActivity中的代码:

[java]  view plain  copy
  1. package com.example.itgungnir.testultraptr;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v7.app.AppCompatActivity;  
  5. import android.widget.ArrayAdapter;  
  6. import android.widget.ListView;  
  7.   
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10.   
  11. import in.srain.cube.views.ptr.PtrClassicFrameLayout;  
  12. import in.srain.cube.views.ptr.PtrDefaultHandler2;  
  13. import in.srain.cube.views.ptr.PtrFrameLayout;  
  14.   
  15. public class MainActivity extends AppCompatActivity {  
  16.     private PtrClassicFrameLayout ptrLayout;  
  17.     private ListView lv;  
  18.   
  19.     private ArrayAdapter<String> adapter;  
  20.     private List<String> dataSource;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.         ptrLayout = (PtrClassicFrameLayout) findViewById(R.id.ptr_layout);  
  27.         lv = (ListView) findViewById(R.id.id_main_lv_lv);  
  28.     }  
  29.   
  30.     @Override  
  31.     protected void onResume() {  
  32.         super.onResume();  
  33.         initData();  
  34.         initView();  
  35.         initEvent();  
  36.     }  
  37.   
  38.     /** 
  39.      * 初始化数据 
  40.      */  
  41.     private void initData() {  
  42.         // 初始化ListView中展示的数据  
  43.         dataSource = new ArrayList<>();  
  44.         for (int i = 1; i <= 50; i++) {  
  45.             dataSource.add("Existed Old List Item " + i);  
  46.         }  
  47.     }  
  48.   
  49.     /** 
  50.      * 初始化布局控件 
  51.      */  
  52.     private void initView() {  
  53.         // 初始化ListView中的数据  
  54.         adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, dataSource);  
  55.         lv.setAdapter(adapter);  
  56.         // 为布局设置头部和底部布局  
  57.         ptrLayout.setHeaderView(new MyPtrRefresher(MainActivity.this));  
  58.         // ptrLayout.setFooterView(new MyPtrRefresher(MainActivity.this));  
  59.         ptrLayout.addPtrUIHandler(new MyPtrHandler(MainActivity.this, ptrLayout));  
  60.     }  
  61.   
  62.     /** 
  63.      * 初始化事件 
  64.      */  
  65.     private void initEvent() {  
  66.         // 为布局设置下拉刷新和上拉加载的回调事件  
  67.         ptrLayout.setPtrHandler(new PtrDefaultHandler2() {  
  68.             @Override  
  69.             public void onLoadMoreBegin(PtrFrameLayout frame) { // 上拉加载的回调方法  
  70.                 frame.postDelayed(new Runnable() {  
  71.                     @Override  
  72.                     public void run() {  
  73.                         dataSource.add("New Bottom List Item");  
  74.                         adapter.notifyDataSetChanged();  
  75.                         ptrLayout.refreshComplete();  
  76.                         lv.smoothScrollToPosition(dataSource.size() - 1);  
  77.                     }  
  78.                 }, 1000);  
  79.             }  
  80.   
  81.             @Override  
  82.             public void onRefreshBegin(PtrFrameLayout frame) { // 下拉刷新的回调方法  
  83.                 frame.postDelayed(new Runnable() {  
  84.                     @Override  
  85.                     public void run() {  
  86.                         dataSource.add(0"New Top List Item");  
  87.                         adapter.notifyDataSetChanged();  
  88.                         ptrLayout.refreshComplete();  
  89.                         lv.smoothScrollToPosition(0);  
  90.                     }  
  91.                 }, 1000);  
  92.             }  
  93.         });  
  94.     }  
  95. }  
(4)头部和尾部布局MyPtrRefresher中的代码:

[java]  view plain  copy
  1. public class MyPtrRefresher extends LinearLayout {  
  2.     public MyPtrRefresher(Context context) {  
  3.         super(context, null);  
  4.         LayoutInflater.from(context).inflate(R.layout.view_ptrrefresher, this);  
  5.     }  
  6.   
  7.     public MyPtrRefresher(Context context, AttributeSet attrs) {  
  8.         super(context, attrs, 0);  
  9.         LayoutInflater.from(context).inflate(R.layout.view_ptrrefresher, this);  
  10.     }  
  11.   
  12.     public MyPtrRefresher(Context context, AttributeSet attrs, int defStyleAttr) {  
  13.         super(context, attrs, defStyleAttr);  
  14.         LayoutInflater.from(context).inflate(R.layout.view_ptrrefresher, this);  
  15.     }  
  16. }  
(5)头部和尾部的布局文件:

[html]  view plain  copy
  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="70.0dip"  
  5.     android:background="#DDDDDD"  
  6.     android:gravity="center"  
  7.     android:orientation="horizontal"  
  8.     android:padding="20.0dip">  
  9.   
  10.     <ImageView  
  11.         android:id="@+id/id_header_iv_img"  
  12.         android:layout_width="30.0dip"  
  13.         android:layout_height="30.0dip"  
  14.         android:background="@mipmap/ic_launcher"  
  15.         android:contentDescription="@string/app_name"  
  16.         android:scaleType="fitXY" />  
  17.   
  18.     <TextView  
  19.         android:id="@+id/id_header_tv_tip"  
  20.         android:layout_width="wrap_content"  
  21.         android:layout_height="wrap_content"  
  22.         android:layout_marginLeft="10.0dip"  
  23.         android:text="Loading......"  
  24.         android:textColor="#FF000000"  
  25.         android:textSize="16.0sp"  
  26.         android:textStyle="bold" />  
  27.   
  28. </LinearLayout>  
(6)刷新回调类MyPtrHandler中的代码:

[java]  view plain  copy
  1. package com.example.itgungnir.testultraptr;  
  2.   
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.view.animation.Animation;  
  8. import android.view.animation.RotateAnimation;  
  9. import android.widget.ImageView;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12.   
  13. import in.srain.cube.views.ptr.PtrFrameLayout;  
  14. import in.srain.cube.views.ptr.PtrUIHandler;  
  15. import in.srain.cube.views.ptr.indicator.PtrIndicator;  
  16.   
  17. /** 
  18.  * 为Ultra-Pull-To-Refresh设置事件回调 
  19.  */  
  20. public class MyPtrHandler implements PtrUIHandler {  
  21.     private Context context;  
  22.   
  23.     private ImageView img;  
  24.     private TextView tip;  
  25.   
  26.     public MyPtrHandler(Context context, ViewGroup parent) {  
  27.         this.context = context;  
  28.         View view = LayoutInflater.from(context).inflate(R.layout.view_ptrrefresher, parent);  
  29.         this.img = (ImageView) view.findViewById(R.id.id_header_iv_img);  
  30.         this.tip = (TextView) view.findViewById(R.id.id_header_tv_tip);  
  31.     }  
  32.   
  33.     @Override  
  34.     public void onUIReset(PtrFrameLayout frame) {  
  35.     }  
  36.   
  37.     @Override  
  38.     public void onUIRefreshPrepare(PtrFrameLayout frame) {  
  39.         tip.setText("Pull To Refresh");  
  40.     }  
  41.   
  42.     @Override  
  43.     public void onUIRefreshBegin(PtrFrameLayout frame) {  
  44.         tip.setText("Loading......");  
  45.         RotateAnimation animation = new RotateAnimation(0360, img.getPivotX(), img.getPivotY());  
  46.         animation.setFillAfter(false);  
  47.         animation.setDuration(1000);  
  48.         animation.setRepeatMode(Animation.RESTART);  
  49.         img.startAnimation(animation);  
  50.     }  
  51.   
  52.     @Override  
  53.     public void onUIRefreshComplete(PtrFrameLayout frame, boolean isHeader) {  
  54.         tip.setText("Load Complete");  
  55.         Toast.makeText(context, "Load Complete!!", Toast.LENGTH_SHORT).show();  
  56.     }  
  57.   
  58.     @Override  
  59.     public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {  
  60.     }  
  61. }  

这个框架还可以有很多样式,如刷新时隐藏头部、iOS样式、自动刷新等等。更多样式参照GitHub中的源码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值