package com.markupartist.android.widget;
import com.markupartist.android.example.pulltorefresh.R;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
public class PullToRefreshListView extends ListView implements OnScrollListener {
private static final int TAP_TO_REFRESH = 1; // 初始状态
private static final int PULL_TO_REFRESH = 2; //拉动刷新
private static final int RELEASE_TO_REFRESH = 3; //释放刷新
private static final int REFRESHING = 4; //正在刷新
private static final String TAG = "PullToRefreshListView";
//刷新接口
private OnRefreshListener mOnRefreshListener;
//箭头图片
private static int REFRESHICON = R.drawable.goicon;
/**
* listview 滚动监听器
*/
private OnScrollListener mOnScrollListener;
//视图索引器
private LayoutInflater mInflater;
/**
* 头部视图 内容 -- start
*/
private RelativeLayout mRefreshView;
private TextView mRefreshViewText;
private ImageView mRefreshViewImage;
private ProgressBar mRefreshViewProgress;
private TextView mRefreshViewLastUpdated;
/**
* 头部视图 内容 -- end
*/
//当前listivew 的滚动状态
private int mCurrentScrollState;
//当前listview 的刷新状态
private int mRefreshState;
//动画效果
//变为向下的箭头
private RotateAnimation mFlipAnimation;
//变为逆向的箭头
private RotateAnimation mReverseFlipAnimation;
//头视图的高度
private int mRefreshViewHeight;
//头视图 原始的 top padding 属性值
private int mRefreshOriginalTopPadding;
//
private int mLastMotionY;
//是否反弹
private boolean mBounceHack;
public PullToRefreshListView(Context context) {
super(context);
init(context);
}
public PullToRefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public PullToRefreshListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
// Load all of the animations we need in code rather than through XML
//初始化动画
//
mFlipAnimation = new RotateAnimation(0, -180,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
mFlipAnimation.setInterpolator(new LinearInterpolator());
mFlipAnimation.setDuration(250);
mFlipAnimation.setFillAfter(true);
mReverseFlipAnimation = new RotateAnimation(-180, 0,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
mReverseFlipAnimation.setInterpolator(new LinearInterpolator());
mReverseFlipAnimation.setDuration(250);
mReverseFlipAnimation.setFillAfter(true);
mInflater = (LayoutInflater) context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
mRefreshView = (RelativeLayout) mInflater.inflate(R.layout.pull_to_refresh_header, this, false);//(R.layout.pull_to_refresh_header, null);
mRefreshViewText =
(TextView) mRefreshView.findViewById(R.id.pull_to_refresh_text);
mRefreshViewImage =
(ImageView) mRefreshView.findViewById(R.id.pull_to_refresh_image);
mRefreshViewProgress =
(ProgressBar) mRefreshView.findViewById(R.id.pull_to_refresh_progress);
mRefreshViewLastUpdated =
(TextView) mRefreshView.findViewById(R.id.pull_to_refresh_updated_at);
mRefreshViewImage.setMinimumHeight(50);
mRefreshView.setOnClickListener(new OnClickRefreshListener());
mRefreshOriginalTopPadding = mRefreshView.getPaddingTop();
mRefreshState = TAP_TO_REFRESH;
addHeaderView(mRefreshView);
super.setOnScrollListener(this);
measureView(mRefreshView);
mRefreshViewHeight = mRefreshView.getMeasuredHeight(); //获取头文件的测量高度
}
@Override
protected void onAttachedToWindow() {
setSelection(1);
}
@Override
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
setSelection(1);
}
/**
* Set the listener that will receive notifications every time the list
* scrolls.
*
* @param l The scroll listener.
*/
@Override
public void setOnScrollListener(AbsListView.OnScrollListener l) {
mOnScrollListener = l;
}
/**
* Register a callback to be invoked when this list should be refreshed.
*
* @param onRefreshListener The callback to run.
*/
public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
mOnRefreshListener = onRefreshListener;
}
/**
* Set a text to represent when the list was last updated.
* @param lastUpdated Last updated at.
*/
public void setLastUpdated(CharSequence lastUpdated) {
if (lastUpdated != null) {
mRefreshViewLastUpdated.setVisibility(View.VISIBLE);
mRefreshViewLastUpdated.setText(lastUpdated);
} else {
mRefreshViewLastUpdated.setVisibility(View.GONE);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//当前手指的Y值
final int y = (int) event.getY();
//Log.i(TAG, "触屏的Y值"+y);
mBounceHack = false; //不反弹
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
//将垂直滚动条设置为可用状态
if (!isVerticalScrollBarEnabled()) {
setVerticalScrollBarEnabled(true);
}
//如果头部刷新条出现,并且不是正在刷新状态
if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
if ((mRefreshView.getBottom() >= mRefreshViewHeight
|| mRefreshView.getTop() >= 0)
&& mRefreshState == RELEASE_TO_REFRESH) { //如果头部视图处于拉离顶部的情况
// Initiate the refresh
mRefreshState = REFRESHING; //将标量设置为,正在刷新
prepareForRefresh(); //准备刷新
onRefresh(); //刷新
} else if (mRefreshView.getBottom() < mRefreshViewHeight
|| mRefreshView.getTop() <= 0) {
// Abort refresh and scroll down below the refresh view
// 停止刷新,并且滚动到头部刷新视图的下一个视图
resetHeader();
setSelection(1); //定位在第二个列表项
}
}
break;
case MotionEvent.ACTION_DOWN:
mLastMotionY = y; //跟踪手指的Y值
break;
case MotionEvent.ACTION_MOVE:
//更行头视图的toppadding 属性
applyHeaderPadding(event);
break;
}
return super.onTouchEvent(event);
}
/****
* 不断的头部的top padding 属性
* @param ev
*/
private
没有合适的资源?快使用搜索试试~ 我知道了~
android listview 下拉回弹刷新效果
共29个文件
class:12个
xml:4个
java:3个
4星 · 超过85%的资源 需积分: 50 2.3k 下载量 182 浏览量
2011-11-09
17:24:28
上传
评论 35
收藏 68KB RAR 举报
温馨提示
android listview 下拉回弹刷新效果, 现在,QQ空间和新浪微博上的效果,是一个比较炫的效果。 你想让你的APP也有这样炫的效果吗? 赶快下载体验吧!
资源推荐
资源详情
资源评论
收起资源包目录
usaListview.rar (29个子文件)
usaListview
.project 847B
src
com
markupartist
android
widget
PullToRefreshListView.java 17KB
example
pulltorefresh
PullToRefreshActivity.java 3KB
AndroidManifest.xml 754B
res
drawable-ldpi
icon.png 2KB
drawable-hdpi
icon.png 4KB
drawable
goicon.jpg 902B
drawable-mdpi
icon.png 3KB
layout
pull_to_refresh.xml 587B
pull_to_refresh_header.xml 3KB
values
strings.xml 400B
assets
gen
com
markupartist
android
example
pulltorefresh
R.java 1KB
default.properties 362B
.classpath 280B
bin
resources.ap_ 13KB
com
markupartist
android
widget
PullToRefreshListView.class 9KB
PullToRefreshListView$OnRefreshListener.class 309B
PullToRefreshListView$OnClickRefreshListener.class 1KB
example
pulltorefresh
R$layout.class 535B
PullToRefreshActivity$1.class 1KB
R$drawable.class 514B
R$attr.class 424B
PullToRefreshActivity.class 3KB
R$id.class 702B
R.class 727B
R$string.class 690B
PullToRefreshActivity$GetDataTask.class 2KB
usaListview.apk 22KB
classes.dex 13KB
共 29 条
- 1
zjl5211314
- 粉丝: 41
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页