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

android-Ultra-Pull-To-Refresh刷新 android-Ultra-Pull-To-Refresh刷新本篇文章是从源码的角度来分析UItraPullToRefresh的刷新,并给出了几个UItraPullToReRefresh几个好看的刷新效果 1.功能介绍 2.功能设计图 3.效果图 4.具体使用 1. 功能介绍 下拉刷新,几乎是每个 Android 应用都会需要的功能。 android-Ultra-Pull-To-Refresh 阅读详情

原文地址:http://www.cnblogs.com/itgungnir/p/6211021.html


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中的源码。


AD元件库构建及维护之——DbLib公共元件库的使用教程 AD元件库构建及维护之——DbLib元件库的使用教程 阅读详情

相关推荐

【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)

​ BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。

weixin_45828972的博客 7450

上拉加载更多 下拉刷新 记录

Build compile 'in.srain.cube:ptr-load-more:1.0.6'Xml 文件 &lt;in.srain.cube.views.ptr.PtrClassicFrameLayout xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"        android:id="@+id/rotate_header...

jsc5039128的博客 726

Matlab:常见涡旋光束仿真

代码: clc clear all close all %% 环形涡旋光束 N = 200; lambda = 632e-9; %波长为632nm k = 2*pi/lambda; %波数 w0 = 3; %束腰半径 x = linspace(-10,10,N); y = linspace(-10,10,N); [X,Y] = meshgrid(x,y); [t...

zzz997的博客 3万+

高效的下拉刷新与上拉加载

直接使用 效果图就不上了自己拿去使用 看看效果第一步(依赖):compile 'in.srain.cube:ptr-load-more:1.0.6'第二步(工具类):package com.jiaoyu.utils; import android.content.Context; import android.util.AttributeSet; import android.view.Moti...

DaWei - 专栏 823

PRPD图谱分析从入门到精通:5种典型放电模式的识别手册

本文详细解析PRPD图谱分析技术,重点介绍电晕放电、悬浮放电等5种典型放电模式的识别方法。通过37组真实案例对比,提供关键识别区和诊断流程图模板,帮助工程师快速掌握变电站设备状态监测的核心技能,提升绝缘缺陷诊断准确率。

weixin_29214199的博客 467

一篇关于轴承故障诊断的综述

在设备的故障检测中,有约30%-40%的设备故障是由轴承故障引起的,因此本文将列举有关检测轴承故障使用到的相关数据集,模型和算法。 数据集 现有的数据集,普遍由固定在电机马达上的两个震动检测器获得,并根据需要,分离震动数据在时域和频域上的特征以供网络模型学习。 不同的数据集,区别在于,检测的马达转速不同,环境不同,取样频率不同,一段样本的时长不同等等 (1)Case Western Reserve University (CWRU) Dataset 该数据集拥有多种数据,测量的时候,通过改变轴承.

weixin_42036144的博客 2万+

Android下拉刷新,上拉加载——Ultra-Pull-To-Refresh-With-Load-More(一)

个人博客:haichenyi.com。感谢关注 简介 Android里面刷新和分页加载是常见的,刷新有Google的SwipeRefreshLayout,但是UI不同意,非要跟IOS一样,那就没办法了。 开源框架链接:Ultra-Pull-To-Refresh-With-Load-More。这个开源框架是基于Ultra-Pull-To-Refresh拓展了一个上拉加载功能。 作者:廖祜...

海晨忆的博客 1449

NACA0012的O型网格求解

本篇文章采用偏微分方程数值解法生成NACA0012翼型O型网格,并采用速度势方程求解绕NACA0012翼型迎角为0度时的低速不可压无粘流场。 文章目录一、求解网格1.翼型2.远场3.网格4.迭代5.求解二、求解流场1.偏微分方程2.迭代求解流场三、求解参数1.偏微分方程2.迭代求解四、导出数据 一、求解网格 1.翼型 本次求解网格和流场等采用的是NACA0012(修形)对称翼型,在NACA四位翼型中,第一位数字代表的是弯度,第二位数字代表的是弯度位置,后两位数字代表的是厚度,由于本次翼型的前两位数字都为0,

m0_50746433的博客 6677

【工作中踩坑之cube-ui中的cube-scroll组件无法滑动到底部的问题】

方便跳转看总结:问题起因问题排查1.首先排查是不是cube-scroll组件使用的方式问题2.检查CSS样式写的有没有问题2.继续看文档,并善用百度解决问题总结 问题起因 起因是最近接手的一个项目迭代了一个需求的新页面,要求根据后台的数据加载出餐厅的餐单,结果渲染之后问题来了,测试的时候发现经常会滚动不到页面最底下 大概情况如下图 问题排查 1.首先排查是不是cube-scroll组件使用的方式问题 身为嘴硬的程序猿,发现错误的第一时间,要想:是不是组件有问题,而不是想:是不是我有问题。接着就检查了一.

weixin_49991545的博客 1519

利用R语言通过holtwinters模型进行预测

使用Holt-Winters模型进行预测的第一步是对模型进行拟合。该函数需要两个参数:您的时间序列数据和一个“seasonal”参数,该参数指示您的数据的周期性(例如,如果您的数据按月记录,则应将“seasonal”参数设置为12,因为一年有12个月)。拟合模型后,您可以使用“forecast()”函数进行预测。该函数需要两个参数:您的拟合模型以及您要进行预测的时间段的长度。要使用Holt-Winters模型,您需要安装并加载“forecast”包。以下是进行Holt-Winters模型预测的示例代码。

Mrrunsen的博客 1696

图像处理入门007:图像处理中的数学基础:线性代数与卷积

一种:把 OpenCV 当黑盒,调用,效果不对就乱调参数;另一种:理解每个像素是怎么被周围邻域"加权平均"的,理解核翻转、边界填充、stride 的含义。前者能干活,后者能解难题。一旦遇到自定义核(比如 ISP 上的锐化)、深度学习反向传播、医学图像重建,你就必须把卷积、相关、矩阵乘法这些基本功捡回来。线性代数三件套:向量点积、矩阵乘法、线性变换;2D 卷积的数学定义:核翻转、滑动窗口、边界填充。并手写一个,验证它与和的结果完全一致(误差 < 1e-9)。f∗gn∑m−∞∞f。

专注:太空算力、AI infra、异构调度、大模型成本工程 387

cube-ui 结合 vue-cli 实现下拉刷新和上拉加载

使用cube-ui 实现下拉刷新,上拉加载 官方文档: https://didi.github.io/cube-ui/#/zh-CN cube-ui 是基于 Vue.js 实现的精致移动端组件库。在我们制作移动端页面时能够给予我们很大帮助,详细介绍都在上方的官方文档中,如何安装这里就不再赘述了。 &amp;lt;div class=&quot;father&quot;&amp;gt; // 需要给 f...

小白阿里里的博客 7329

【软考】高项论文写作常见模板

本文主要介绍了YYYY年MM月DD日,我所在公司承接了XXXX项目的建设过程,包括了XXX,XXX,XXX内容,涉及到XXX,XXX,XXX技术。本人在项目中承载着项目经理的角色,主要负责了XXX,XXX,XXX方面事宜。此项目时间紧,任务重,实施过程中,我们特别注重了1、XXX 2、XXX 3、XXX几个方面,经过团队的一致努力,本项目按时交付,运行至今,客户反馈良好。但是在实施过程中,也曝露除了一些问题,包括了XXX,XXX等,通过应急处理和协调,这些问题都得到了妥善解决,没有影响到项目进度。

奶爸的编程之路,也就一周冷个三天 1687

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

原地址:http://blog.youkuaiyun.com/itgungnir/article/details/53433487         Ultra-Pull-To-Refresh框架是用来嵌套其他布局,实现下拉刷新和上拉加载的框架。它其中可以嵌套任何控件,ListView、GridView、ScrollView、RecyclerView,甚至TextView。      

Elvis写代码 537

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

下拉刷新上拉加载框架:android-Ultra-Pull-To-Refresh

下拉刷新上拉加载框架:PtrClassicFrameLayout 1、一个优雅的框架实现下拉刷新上拉加载,学习来源:点击打开链接 2、如何使用: 2.1、在项目中引入: compile 'com.shizhefei:MVCHelper-UltraRefresh:1.3.2' compile 'in.srain.cube:ultra-ptr:1.0.11' 2.2、在布局文...

达帮主 703

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android - 框架】之刷新加载框架Ultra-Pull-To-Refresh的使用,及其自定义头部刷新和底部加载更多

最近项目已经接近尾声了,由于一些原因,我可能又要找新的工作了,啊啊啊,有点忧伤。 之前有在新浪写过一写博客,现在准备在优快云上写博客了,优快云博客-最大IT写作分享平台,很多资料都可以在这找到,所有我也搬家了。 自己也写了好几个项目了,但是博客还没有多少,其实有很多东西都需要记记得,温故而知新嘛!趁不忙,就记录记录。 好了 ,上面的可以忽略,下面正式开始了! 下拉刷新,上拉加载更...

潇潇 1297

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

5分钟搞定Android下拉刷新骨架屏:Ultra-Pull-To-Refresh实战指南

你是否还在为Android应用的下拉刷新体验烦恼?用户下拉后面对空白屏幕不知所措?本文将手把手教你结合Ultra-Pull-To-Refresh与Shimmer动画实现优雅的骨架屏效果,让加载过程不再枯燥。读完本文你将掌握: - 下拉刷新框架核心原理 - 自定义骨架屏布局实现 - Shimmer动画集成技巧 - 完整的代码实现方案 ## 框架核心原理 Ultra-Pull-To-Refresh

gitblog_00702的博客 622

Android-Ultra-Pull-To-Refresh 下拉刷新控件

Android-Ultra-Pull-To-Refresh框架看看:效果一步下载jar包或aar文件android-Ultra-Pull-To-Refresh的特点是:内置各种下拉刷新交互风格。遗憾的是这个库不支持上拉加载更多。android-Ultra-Pull-To-Refresh (简称 UltraPTR )是一个强大的 Andriod 下拉刷新框架。1.继承自ViewGroup,Con...

达帮主 687

Android练兵--Material加载进度条

最近看了几款APP的加载进度都是这种风格,感觉还不错,在网上找了一些资料,自己小练兵了一把:

陈正的博客 1725

下拉刷新上拉加载更多

Ultra-Pull-To-Refresh框架是用来嵌套其他布局,实现下拉刷新和上拉加载的框架。它其中可以嵌套任何控件,ListView、GridView、ScrollView、RecyclerView,甚至TextView。         这个框架在GitHub上的地址:【Ultra-Pull-To-Refresh-With-Load-More】。   (1)首先需要导入框架

yufumatou的博客 532

RecyclerView下拉刷新上拉加载更多--EasyRecyclerView

EasyRecyclerView描述这是一个下拉刷新上拉加载更多框架(ps:后期还会加入一些常用的功能.),头部用的秋哥的android-Ultra-Pull-To-Refresh,底部和没有数据的状态自己实现的.其实刚刚开始我是想找个库直接用的,试了几个排名靠前的,感觉跟自己想要的不太一样,索性自己写了一个,当然这当中也遇到了问题,多亏仲锦大师的帮助在此感谢.感谢完了附上库的地址EasyRecyc

朱利源的博客 9402

Android学习之打造美女图片浏览器

本文旨在教你打造一个真实的一个图片浏览器,并非写一堆链接用来测试;也算是用到Android基本的常用的知识,对于初学者来说是一个不错的练手demo;当然本文对于图片加载也有自己的一些见解,希望可以帮助到各位;                                        首先在开始讲解前要感谢一下github开源社区给了我很多帮助,相信不少人也从这里获取到

xiaozhiwz的专栏 3963

【框架学习】【android-Ultra-Pull-To-Refresh】

本篇学习的内容主要参考文章:http://a.codekk.com/detail/Android/Grumoon/android-Ultra-Pull-To-Refresh%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90 一、主要特点: android-Ultra-Pull-To-Refresh (简称 UltraPTR )是一个强大的 Andriod 下

bear_huangzhen的专栏 3824

实现自动刷新功能:Ultra-Pull-To-Refresh的autoRefresh方法详解

你是否还在为Android应用的自动刷新功能开发而烦恼?手动下拉刷新虽能满足基本需求,但在应用启动、页面切换等场景下,自动触发刷新能显著提升用户体验。本文将详细解析Ultra-Pull-To-Refresh库中autoRefresh方法的实现原理与使用技巧,帮助你轻松掌握这一实用功能。 读完本文,你将能够: - 理解autoRefresh方法的核心工作机制 - 掌握不同参数组合的使用场景 - 解...

gitblog_00919的博客 925

下拉刷新框架android-Ultra-Pull-To-Refresh导入到Android Studio

最近有个很火的下拉刷新框架:android-Ultra-Pull-To-Refresh。 源码:https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 源码分析:http://a.codekk.com/detail/Android/Grumoon/android-Ultra-Pull-To-Refresh%20%E6%BA%90%E

凡蒂尼的老猫 4845

下拉刷新框架Android-Ultra-Pull-To-Refresh的学习

下拉刷新框架Android-Ultra-Pull-To-Refresh的学习与使用

shan286的专栏 1596
上一篇: ToolBar的title居中以及一些注意事项
下一篇: Android:打造万能通用适配器
dodod2012
博客等级 码龄15年 244粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值