package com.xj.test;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
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.Adapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
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 int LIST_ITEM_HEIGHT = 60;
private static final String TAG = "PullToRefreshListView";
private OnRefreshListener mOnRefreshListener;
public Activity context;
/**
* Listener that will receive notifications every time the list scrolls.
*/
private OnScrollListener mOnScrollListener;
private LayoutInflater mInflater;
private Adapter adapter;
private boolean isFirstRun = true;
private boolean isActionDown = true;
private LinearLayout mRefreshView;
private View footerView;
private TextView mRefreshViewText;
private ImageView mRefreshViewImage;
private ProgressBar mRefreshViewProgress;
private TextView mRefreshViewLastUpdated;
private int mCurrentScrollState;
private int mRefreshState;
private RotateAnimation mFlipAnimation;
private RotateAnimation mReverseFlipAnimation;
private int mRefreshViewHeight;
private int mFooterViewHeight;
private int mRefreshOriginalTopPadding;
private int mLastMotionY;
private int mItemTotalHeight;
private int mAdapterCount;
private int mWindowHeight;
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
this.context = (Activity)context;
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 = (LinearLayout) mInflater.inflate(R.layout.public_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);
footerView = new View(context);
footerView.setFocusable(false);
footerView.setFocusableInTouchMode(false);
footerView.setEnabled(false);
footerView.setBackgroundColor(Color.WHITE);
addFooterView(footerView);
super.setOnScrollListener(this);
measureView(mRefreshView);
mRefreshViewHeight = mRefreshView.getMeasuredHeight();
}
@Override
protected void onAttachedToWindow() {
setSelection(1);
}
public void setFooterHeight(){
Log.e("***setFooterHeight***", "***" + mFooterViewHeight + "***");
if(mFooterViewHeight > 0){
footerView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, mFooterViewHeight));
}
else{
footerView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, 0));
}
}
@Override
public void setAdapter(ListAdapter adapter) {
this.adapter = adapter;
int width = getWidth();
mWindowHeight = context.getWindowManager().getDefaultDisplay().getHeight();
Log.e("===setAdapter===", width + " * " + mWindowHeight);
mAdapterCount = adapter.getCount();
mItemTotalHeight = mAdapterCount * LIST_ITEM_HEIGHT;
mFooterViewHeight = mWindowHeight - mItemTotalHeight + mRefreshViewHeight;
setFooterHeight();
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() {
SimpleDateFormat sdf = new SimpleDateFormat(" MM/dd/yyyy HH:mm");
mRefreshViewLastUpdated.setText(context.getString(R.string.pull_to_refresh_last_update) + sdf.format(new Date()));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int y = (int) event.getY();
int count = adapter.getCount();
View view = null;
if(count > 0){
view = getChildAt(1);
}else{
view = getChildAt(0);
}
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) {
mRefreshState = REFRESHING;
prepareForRefresh();
onRefresh();
} else if (mRefreshView.getBottom() < mRefreshViewHeight
|| mRefreshView.getTop() < 0) {
resetHeader();
setSelection(1);
}
}
break;
case MotionEvent.ACTION_DOWN:
mLastMotionY = y;
if(isFirstRun){
isFirstRun = false;
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
autoresh.rar (35个子文件)
autoresh
AndroidManifest.xml 685B
res
layout
pull_to_refresh.xml 532B
pull_to_refresh_header.xml 2KB
public_pull_to_refresh_header.xml 3KB
drawable
pull_to_refresh_header_background.xml 900B
ic_refresh.xml 157B
drawable-hdpi
ic_pull_arrow.png 775B
ic_pulltorefresh_arrow.png 1KB
ic_refresh_black.png 686B
ic_refresh_white.png 673B
icon.png 4KB
Thumbs.db 9KB
values
strings.xml 482B
proguard.cfg 1KB
src
com
xj
test
PullToRefreshListView.java 16KB
PullToRefreshActivity.java 2KB
bin
com
xj
test
PullToRefreshActivity$RefreshListThread.class 1KB
R.class 482B
PullToRefreshActivity$1.class 949B
PullToRefreshActivity.class 2KB
R$layout.class 483B
R$attr.class 319B
PullToRefreshListView.class 11KB
PullToRefreshListView$OnRefreshListener.class 269B
R$id.class 548B
R$string.class 636B
PullToRefreshListView$OnClickRefreshListener.class 1KB
R$drawable.class 633B
classes.dex 14KB
resources.ap_ 15KB
autoresh.apk 24KB
.classpath 280B
assets
default.properties 362B
.project 844B
gen
com
xj
test
R.java 2KB
共 35 条
- 1
paul250670
- 粉丝: 7
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页