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

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

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

    // Ultra-Pull-To-Refresh框架的依赖
compile 'in.srain.cube:ptr-load-more:1.0.6'

(2)在XML文件中使用:

<?xml version="1.0" encoding="utf-8"?>
<!--
ptr:ptr_duration_to_close_either:头部和底部回弹时间
ptr:ptr_keep_header_when_refresh:刷新过程中是否保留头部
ptr:ptr_pull_to_fresh:下拉刷新/释放刷新,默认是释放刷新
ptr:ptr_ratio_of_header_height_to_refresh:触发刷新时移动的位置比例,指的是与头部的比例
ptr:ptr_resistance:阻尼系数,越大下拉越吃力
-->
<in.srain.cube.views.ptr.PtrClassicFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
ptr:ptr_duration_to_close_either="1000"
ptr:ptr_keep_header_when_refresh="true"
ptr:ptr_pull_to_fresh="false"
ptr:ptr_ratio_of_header_height_to_refresh="1.2"
ptr:ptr_resistance="1.7"> <ListView
android:id="@+id/id_main_lv_lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</in.srain.cube.views.ptr.PtrClassicFrameLayout>

(3)MainActivity中的代码:

package com.example.itgungnir.testultraptr;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView; import java.util.ArrayList;
import java.util.List; import in.srain.cube.views.ptr.PtrClassicFrameLayout;
import in.srain.cube.views.ptr.PtrDefaultHandler2;
import in.srain.cube.views.ptr.PtrFrameLayout; public class MainActivity extends AppCompatActivity {
private PtrClassicFrameLayout ptrLayout;
private ListView lv; private ArrayAdapter<String> adapter;
private List<String> dataSource; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ptrLayout = (PtrClassicFrameLayout) findViewById(R.id.ptr_layout);
lv = (ListView) findViewById(R.id.id_main_lv_lv);
} @Override
protected void onResume() {
super.onResume();
initData();
initView();
initEvent();
} /**
* 初始化数据
*/
private void initData() {
// 初始化ListView中展示的数据
dataSource = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
dataSource.add("Existed Old List Item " + i);
}
} /**
* 初始化布局控件
*/
private void initView() {
// 初始化ListView中的数据
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, dataSource);
lv.setAdapter(adapter);
// 为布局设置头部和底部布局
ptrLayout.setHeaderView(new MyPtrRefresher(MainActivity.this));
// ptrLayout.setFooterView(new MyPtrRefresher(MainActivity.this));
ptrLayout.addPtrUIHandler(new MyPtrHandler(MainActivity.this, ptrLayout));
} /**
* 初始化事件
*/
private void initEvent() {
// 为布局设置下拉刷新和上拉加载的回调事件
ptrLayout.setPtrHandler(new PtrDefaultHandler2() {
@Override
public void onLoadMoreBegin(PtrFrameLayout frame) { // 上拉加载的回调方法
frame.postDelayed(new Runnable() {
@Override
public void run() {
dataSource.add("New Bottom List Item");
adapter.notifyDataSetChanged();
ptrLayout.refreshComplete();
lv.smoothScrollToPosition(dataSource.size() - 1);
}
}, 1000);
} @Override
public void onRefreshBegin(PtrFrameLayout frame) { // 下拉刷新的回调方法
frame.postDelayed(new Runnable() {
@Override
public void run() {
dataSource.add(0, "New Top List Item");
adapter.notifyDataSetChanged();
ptrLayout.refreshComplete();
lv.smoothScrollToPosition(0);
}
}, 1000);
}
});
}
}

(4)头部和尾部布局MyPtrRefresher中的代码:

public class MyPtrRefresher extends LinearLayout {
public MyPtrRefresher(Context context) {
super(context, null);
LayoutInflater.from(context).inflate(R.layout.view_ptrrefresher, this);
} public MyPtrRefresher(Context context, AttributeSet attrs) {
super(context, attrs, 0);
LayoutInflater.from(context).inflate(R.layout.view_ptrrefresher, this);
} public MyPtrRefresher(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
LayoutInflater.from(context).inflate(R.layout.view_ptrrefresher, this);
}
}

(5)头部和尾部的布局文件:

<?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="70.0dip"
android:background="#DDDDDD"
android:gravity="center"
android:orientation="horizontal"
android:padding="20.0dip"> <ImageView
android:id="@+id/id_header_iv_img"
android:layout_width="30.0dip"
android:layout_height="30.0dip"
android:background="@mipmap/ic_launcher"
android:contentDescription="@string/app_name"
android:scaleType="fitXY" /> <TextView
android:id="@+id/id_header_tv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10.0dip"
android:text="Loading......"
android:textColor="#FF000000"
android:textSize="16.0sp"
android:textStyle="bold" /> </LinearLayout>

(6)刷新回调类MyPtrHandler中的代码:

package com.example.itgungnir.testultraptr;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrUIHandler;
import in.srain.cube.views.ptr.indicator.PtrIndicator; /**
* 为Ultra-Pull-To-Refresh设置事件回调
*/
public class MyPtrHandler implements PtrUIHandler {
private Context context; private ImageView img;
private TextView tip; public MyPtrHandler(Context context, ViewGroup parent) {
this.context = context;
View view = LayoutInflater.from(context).inflate(R.layout.view_ptrrefresher, parent);
this.img = (ImageView) view.findViewById(R.id.id_header_iv_img);
this.tip = (TextView) view.findViewById(R.id.id_header_tv_tip);
} @Override
public void onUIReset(PtrFrameLayout frame) {
} @Override
public void onUIRefreshPrepare(PtrFrameLayout frame) {
tip.setText("Pull To Refresh");
} @Override
public void onUIRefreshBegin(PtrFrameLayout frame) {
tip.setText("Loading......");
RotateAnimation animation = new RotateAnimation(0, 360, img.getPivotX(), img.getPivotY());
animation.setFillAfter(false);
animation.setDuration(1000);
animation.setRepeatMode(Animation.RESTART);
img.startAnimation(animation);
} @Override
public void onUIRefreshComplete(PtrFrameLayout frame, boolean isHeader) {
tip.setText("Load Complete");
Toast.makeText(context, "Load Complete!!", Toast.LENGTH_SHORT).show();
} @Override
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {
}
}

这个框架还可以有很多样式,如刷新时隐藏头部、iOS样式、自动刷新等等。更多样式参照GitHub中的源码。

【Android - 框架】之刷新加载框架Ultra-Pull-To-Refresh的使用的更多相关文章

  1. Android高效异步图片加载框架

    概述 Android高效异步图片加载框架:一个高效的异步加载显示的图片加载框架,同时具备图片压缩,缓存机制等特性. 详细 代码下载:http://www.demodashi.com/demo/1214 ...

  2. Android项目框架之图片加载框架的选择

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 从Android爆发以后,自定义的控件如EditTextWithDelete.ActionBar.P ...

  3. Android智能下拉刷新加载框架—看这些就够了

    一些值得学习的几个下拉刷新上拉加载开源库 Android智能下拉刷新框架-SmartRefreshLayout 支持所有的 View(AbsListView.RecyclerView.WebView. ...

  4. Android图片加载框架最全解析(一),Glide的基本用法

    现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有 ...

  5. Fresco从配置到使用(最高效的图片加载框架)

    Frescoj说明:      facebook开源的针对android应用的图片加载框架,高效和功能齐全. 支持加载网络,本地存储和资源图片: 提供三级缓存(二级memory和一级internal ...

  6. Android 框架修炼-自己开发高效异步图片加载框架

    一.概述 目前为止,第三方的图片加载框架挺多的,比如UIL , Volley Imageloader等等.但是最好能知道实现原理,所以下面就来看看设计并开发一个加载网络.本地的图片框架. 总所周知,图 ...

  7. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

  8. android快捷开发之Retrofit网络加载框架的简单使用

    大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据 ...

  9. Android动态加载框架汇总

    几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...

随机推荐

  1. mouseover和mouseout事件在鼠标经过子元素时也会触发

    JavaScript的mouseover和mouseout事件,在绑定元素内部有子元素的情况下, 经过绑定元素时会多次触发mouseover和mouseout事件. jQuery解决办法: jquer ...

  2. css字体大小设置em与rem的区别

    em 单位em是相对于父元素的,如果父元素没有设置字体大小,那就会追溯到body. 比如  如果我在box_text的父元素box加了一个字体大小   那么body的8px就会被box_text的父元 ...

  3. AS3.0面向对象的写法,类和实例

    package /*package是包路径,例如AS文件在ActionScript文件夹下,此时路径应为package ActionScript.必须有的.package中只能有一个class,在一个 ...

  4. MyISAM 和 InnoDB 讲解[转]

    MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...

  5. [网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结

    TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议.一.UDP主要特点:传输的是用户数据报协议.1. ...

  6. ubuntu 14.04安装quickbuild server (一)

    官网: http://www.pmease.com/ 指导网站: http://wiki.pmease.com/display/QB60/ 1.  安装quickbuild server ------ ...

  7. VS 调试相关

    最近用VS2013 调试遇到的一点小问题,老年痴呆做一下记录. 1. IIS 用 w3wp.exe 调试: IIS 中的文件系统与工程的保持一致,否则断点不会命中: 发布文件系统后,重启站点对应的应用 ...

  8. 支付宝集成SDK 报错

    1.打开Demo中的错误 这是路径错误导致 解决办法:在Build Settings 中找到 Library Search Paths ,去掉其中的 /// 2.自己集成支付宝SDK时的错误 这个也是 ...

  9. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  10. (转载)KL距离,Kullback-Leibler Divergence

    转自:KL距离,Kullback-Leibler Divergence   KL距离,是Kullback-Leibler差异(Kullback-Leibler Divergence)的简称,也叫做相对 ...