原理:就是动态改变ScrollView header的margin实现

主要的代码:

http://blog.csdn.net/swust_chenpeng/article/details/39289721

代码其实还是比较容易,但是但是,自己还是花了很多时间,脑袋瓜不够灵活呀...

下面是ScrollViewHeader的代码:

public class ScrollViewHeader extends RelativeLayout {  

    public final static int STATE_NORMAL = 0;
public final static int STATE_READY = 1;
public final static int STATE_REFRESHING = 2;
private final int ROTATE_ANIM_DURATION = 180;
private int topMargin = 0;
private int state = STATE_NORMAL;
private TextView refreshTv = null;
private TextView refreshTimeTv = null;
private ProgressBar refreshProgress = null;
private ImageView refreshArrow = null;
private Animation animationUp = null;
private Animation animationDown = null; public ScrollViewHeader(Context context) {
super(context);
// TODO Auto-generated constructor stub
if(!isInEditMode())
initView(context);
} public ScrollViewHeader(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
if(!isInEditMode())
initView(context);
} public ScrollViewHeader(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
if(!isInEditMode())
initView(context);
} /**
* 初始化相关的view
*/
public void initView(Context context) {
animationDown = new RotateAnimation(-180f, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animationDown.setDuration(ROTATE_ANIM_DURATION);
animationDown.setFillAfter(true);
animationUp = new RotateAnimation(0, -180f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animationUp.setDuration(ROTATE_ANIM_DURATION);
animationUp.setFillAfter(true);
setPadding(10, 25, 10, 25);
View view = LayoutInflater.from(context).inflate(R.layout.scrollview_header, this, true);
refreshTv = (TextView) view.findViewById(R.id.refresh_text);
refreshTimeTv = (TextView) view.findViewById(R.id.refresh_time);
refreshProgress = (ProgressBar) view.findViewById(R.id.refresh_progress);
refreshArrow = (ImageView) view.findViewById(R.id.refresh_arrow);
} /**
* 设置scrollviewHeader的状态
* @param state
*/
public void setState(int state) {
if(this.state == state) {
return ;
}
switch (state) {
case STATE_NORMAL:
refreshTv.setText("下拉刷新");
refreshArrow.setVisibility(View.VISIBLE);
refreshProgress.setVisibility(View.INVISIBLE);
if(this.state == STATE_READY) {
refreshArrow.startAnimation(animationDown);
} else if(this.state == STATE_REFRESHING) {
refreshArrow.clearAnimation();
}
break;
case STATE_READY:
refreshTv.setText("松开刷新");
refreshArrow.setVisibility(View.VISIBLE);
refreshProgress.setVisibility(View.INVISIBLE);
refreshArrow.startAnimation(animationUp);
break;
case STATE_REFRESHING:
refreshTv.setText("正在加载...");
refreshProgress.setVisibility(View.VISIBLE);
refreshArrow.clearAnimation();
refreshArrow.setVisibility(View.INVISIBLE);
break;
default:
break;
}
this.state = state;
} /**
* 更新header的margin
* @param margin
*/
public void updateMargin(int margin) {
//这里用Linearlayout的原因是Headerview的父控件是scrollcontainer是一个linearlayout
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) this.getLayoutParams();
params.topMargin = margin;
topMargin = margin;
setLayoutParams(params);
} /**
* 获取header的margin
* @return
*/
public int getTopMargin() {
return topMargin;
}
}

header的布局文件,scrollview_header

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" > <LinearLayout
android:id="@+id/refresh_des"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/refresh_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下拉刷新" /> <TextView
android:id="@+id/refresh_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5分钟前更新" />
</LinearLayout> <ProgressBar
android:id="@+id/refresh_progress"
android:layout_width="30dip"
android:layout_height="30dip"
android:layout_centerVertical="true"
android:layout_marginRight="10dip"
android:layout_toLeftOf="@id/refresh_des"
android:visibility="invisible" /> <ImageView
android:id="@+id/refresh_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="10dip"
android:layout_toLeftOf="@id/refresh_des"
android:src="@drawable/arrow" /> </merge>

好了,相关的源码就只有3个文件...

分享一个可下拉刷新的ScrollView的更多相关文章

  1. [RN] React Native 使用 FlatList 和 ScrollView 的下拉刷新问题

    React Native 使用 FlatList 和 ScrollView 实现 下拉刷新时,RefreshControl 控件不起作用, 后来经查明,原来 RefreshControl 要加在 Sc ...

  2. 【微信小程序】scroll-view 的上拉加载和下拉刷新

    1.在微信小程序中,想到 下拉刷新 和 上拉加载,如果是整个页面都拖动的话,可以在页面配置中,配置 enablePullDownRefresh 和 onReachBottomDistance 然后在 ...

  3. scroll-view组件实现下拉刷新, 拉到底加载更多

    官方文档已声明,即使在page.json和app.json中开启下拉刷新,scroll-view组件也是不支持的.但我们可以通过曲线救国的方法来实现 实现代码 // wxml <scroll-v ...

  4. PullToRefresh使用详解(一)--构建下拉刷新的listView

    前言:前几天写了篇关于PullToRefresh控件的DEMO导入的博客,但由于当时没有用到,所以就没细往下讲,现在开始到了实战阶段,用到了PullToRefresh的listView样式,网上有讲的 ...

  5. UITableView:下拉刷新和上拉加载更多

    [转载请注明出处] 本文将说明让UIScrollView支持"下拉刷新"和"上拉加载更多"的实现机制,并实现一个可用的tableView子类,以下主要以&quo ...

  6. 指令汇B新闻客户端开发(三) 下拉刷新

    现在我们继续这个新闻客户端的开发,今天分享的是下拉刷新的实现,我们都知道下拉刷新是一个应用很常见也很实用的功能.我这个应用是通过拉ListView来实现刷新的,先看一张刷新的原理图 从图中可知,手指移 ...

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

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

  8. iOS 下拉刷新-上拉加载原理

    前言 讲下拉刷新及上拉加载之前先给大家解释UIScrollView的几个属性 contentSize是UIScrollView可以滚动的区域. contentOfinset 苹果官方文档的解释是&qu ...

  9. Android下拉刷新底部操作栏的隐藏问题

    最近自己编写下拉刷新的时候,发现了一个问题,就是有一个需求是这样的:要求页面中是一个Tab切换界面,一个界面有底部操作栏,不可下拉刷新,另一个界面没有底部操作栏,但可以下拉刷新. 按照平常的做法,我在 ...

随机推荐

  1. Redis单机数据迁移至Sentinel集群

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  2. CentOS 启动-运行级别

    Linux系统的启动过程:内核的引导 > 运行init > 系统初始化 > 建立终端 > 用户登录系统 运行init init 进程是系统所有进程的起点: 主要功能: 准备软件 ...

  3. spring 学习总结(一)

    一.spring概述 1.spring 是什么? Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2 ...

  4. javaweb之jsp指令

    1.JSP指令简介 JSP指令是为JSP引擎设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令:page指令,Include指 ...

  5. Oracle中实现find_in_set

    CREATE OR REPLACE FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',') ...

  6. Django 常用字段和参数

    一.ORM字段 类型 说明 AutoField 一个自动增加的整数类型字段.通常你不需要自己编写它,Django会自动帮你添加字段:`id = models.AutoField(primary_key ...

  7. UOJ#288:基础数据结构练习题

    题面 UOJ Sol 玄学,不会势能分析 所以 维护区间最大最小值 把开根变成区间减法 如果最大值开根后的变化量和最小值的相等,就直接打个减法\(lazy\) # include <bits/s ...

  8. 11.6NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 100 = 300\) 实际得分:\(100 +100 +100 = 300\) 学OI两年终于AK了一次qwq(虽然题目炒鸡水..) 纪念一下这令人激 ...

  9. endwith与startwith字符串方法匹配重写

    endwith与startwith字符串方法匹配重写 在js读取文件信息并判断文件的格式类型时出现问题,并找到解决方案,写下来与大家分享,共勉. ---DanlV 描述 本人在上传MP3格式文件时,需 ...

  10. Spring 框架(一)

    1 spring框架概述 1.1 什么是spring l Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert ...