package net.kevin.util;
import java.util.Date;
import com.genius.test.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.View.OnClickListener;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
public class RefreshListView extends ListView implements OnScrollListener, OnClickListener{
private View mHeadView;
private TextView mRefreshTextview;
private TextView mLastUpdateTextView;
private ImageView mArrowImageView;
private ProgressBar mHeadProgressBar;
private int mHeadContentWidth;
private int mHeadContentHeight;
private IOnRefreshListener mOnRefreshListener; // 头部刷新监听器
// 用于保证startY的值在一个完整的touch事件中只被记录一次
private boolean mIsRecord = false;
// 标记的Y坐标值
private int mStartY = 0;
// 当前视图能看到的第一个项的索引
private int mFirstItemIndex = -1;
// MOVE时保存的Y坐标值
private int mMoveY = 0;
// LISTVIEW状态
private int mViewState = IListViewState.LVS_NORMAL;
private final static int RATIO = 2;
private RotateAnimation animation;
private RotateAnimation reverseAnimation;
private boolean mBack = false;
public RefreshListView(Context context) {
super(context);
init(context);
}
public RefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void setOnRefreshListener(IOnRefreshListener listener)
{
mOnRefreshListener = listener;
}
private void onRefresh()
{
if (mOnRefreshListener != null)
{
mOnRefreshListener.OnRefresh();
}
}
public void onRefreshComplete()
{
mHeadView.setPadding(0, -1 * mHeadContentHeight, 0, 0);
mLastUpdateTextView.setText("最近更新:" + new Date().toLocaleString());
switchViewState(IListViewState.LVS_NORMAL);
}
private void init(Context context)
{
initHeadView(context);
initLoadMoreView(context);
setOnScrollListener(this);
}
// 初始化headview试图
private void initHeadView(Context context)
{
mHeadView = LayoutInflater.from(context).inflate(R.layout.head, null);
mArrowImageView = (ImageView) mHeadView.findViewById(R.id.head_arrowImageView);
mArrowImageView.setMinimumWidth(60);
mHeadProgressBar= (ProgressBar) mHeadView.findViewById(R.id.head_progressBar);
mRefreshTextview = (TextView) mHeadView.findViewById(R.id.head_tipsTextView);
mLastUpdateTextView = (TextView) mHeadView.findViewById(R.id.head_lastUpdatedTextView);
measureView(mHeadView);
mHeadContentHeight = mHeadView.getMeasuredHeight();
mHeadContentWidth = mHeadView.getMeasuredWidth();
mHeadView.setPadding(0, -1 * mHeadContentHeight, 0, 0);
mHeadView.invalidate();
addHeaderView(mHeadView, null, false);
animation = new RotateAnimation(0, -180,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
animation.setInterpolator(new LinearInterpolator());
animation.setDuration(250);
animation.setFillAfter(true);
reverseAnimation = new RotateAnimation(-180, 0,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
reverseAnimation.setInterpolator(new LinearInterpolator());
reverseAnimation.setDuration(200);
reverseAnimation.setFillAfter(true);
}
// 初始化footview试图
private void initLoadMoreView(Context context)
{
mFootView= LayoutInflater.from(context).inflate(R.layout.loadmore, null);
mLoadMoreView = mFootView.findViewById(R.id.load_more_view);
mLoadMoreTextView = (TextView) mFootView.findViewById(R.id.load_more_tv);
mLoadingView = mFootView.findViewById(R.id.loading_layout);
mLoadMoreView.setOnClickListener(this);
addFooterView(mFootView);
}
// 此方法直接照搬自网络上的一个下拉刷新的demo,计算headView的width以及height
private void measureView(View child) {
ViewGroup.LayoutParams p = child.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);
int lpHeight = p.height;
int childHeightSpec;
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,
MeasureSpec.EXACTLY);
} else {
childHeightSpec = MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec, childHeightSpec);
}
public void onScroll(AbsListView arg0, int firstVisiableItem, int visibleItemCount, int totalItemCount) {
mFirstItemIndex = firstVisiableItem;
}
public void onScrollStateChanged(AbsListView arg0, int arg1) {
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mOnRefreshListener != null)
{
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
doActionDown(ev);
break;
case MotionEvent.ACTION_MOVE:
doActionMove(ev);
break;
case MotionEvent.ACTION_UP:
doActionUp(ev);
break;
default:
break;
}
}
return super.onTouchEvent(ev);
}
private void doActionDown(MotionEvent ev)
{
if(mIsRecord == false && mFirstItemIndex == 0)
{
mStartY = (int) ev.getY();
mIsRecord = true;
}
}
private void doActionMove(MotionEvent ev)
{
mMoveY = (int) ev.getY();
if(mIsRecord == false && mFirstItemIndex == 0)
{
mStartY = (int) ev.getY();
mIsRecord = true;
}
if (mIsRecord == false || mViewState == IListViewState.LVS_LOADING)
{
return ;
}
int offset = (mMoveY - mStartY) / RATIO;
switch(mViewState)
{
case IListViewState.LVS_NORMAL:
{
if (offset > 0)
{
mHeadView.setPadding(0, offset - mHeadContentHeight, 0, 0);
switchViewState(IListViewState.LVS_PULL_REFRESH);
}
}
break;
case IListViewState.LVS_PULL_REFRESH:
{
setSelection(0);
mHeadView.setPadding(0, offset - mHeadContentHeight, 0, 0);
if (offset < 0)
{
switchViewState(IListViewState.LVS_NORMAL);
}else if (offset > mHeadContentHeight)
{
switchViewState(IListViewState.LVS_RELEASE_REFRESH);
}
}
break;
case IListViewState.LVS_RELEASE_REFRESH:
{
setSelection(0);
mHeadView.setPadding(0, offset - mHeadContentHeight, 0, 0);
if (offset >= 0 && offset <= mHeadContentHeight)
{
mBack = true;
switchViewState(IListViewState.LVS_PULL_REFRESH);
}else if (offset < 0)
{
switchViewState(IListViewState.LVS_NORMAL);
}else{
}
}
break;
default:
return;
};
}
private void doActionUp(MotionEvent ev)
{
mIsRecord = false;
mBack = false;
if (mViewState == IListViewState.LVS_LOADING)
{
return ;
}
switch(mViewState)
{
case IListViewState.LVS_NORMAL:
break;
case IListViewState.LVS_PULL_REFRESH:
mHeadView.setPadding(0, -1 * mHeadContentHeight, 0, 0);
switchViewState(IListViewState.LVS_NORMAL);
break;
case IListViewState.LVS_RELEASE_REFRESH:
mHeadView.setPadding(0, 0, 0, 0);
switchViewState(IListViewState.LVS_LOADING);
onRefresh();
break;
}
}
// 切换headview视图
private void switchViewState(int state)
{
switch(state)
{
case IListViewState.LVS_NORMAL:
{
Log.e("!!!!!!!!!!!", "convert to IListViewState.LVS_NORMAL");
mArrowImageView.clearAnimation();
mArrowImageView.setImageResource
没有合适的资源?快使用搜索试试~ 我知道了~
下拉刷新2.zip项目安卓应用源码下载
共50个文件
class:17个
xml:10个
png:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 60 浏览量
2022-03-09
10:11:42
上传
评论
收藏 147KB ZIP 举报
温馨提示
下拉刷新2.zip项目安卓应用源码下载下拉刷新2.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
资源推荐
资源详情
资源评论
收起资源包目录
下拉刷新2.zip (50个子文件)
下拉刷新2
下拉刷新2
ListviewDemo
.project 848B
bin
RefreshListviewDemo.apk 28KB
RefreshListviewDemoActivity.apk 25KB
AndroidManifest.xml 745B
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
arrow.png 461B
ic_launcher.png 4KB
drawable-mdpi
ic_launcher.png 2KB
resources.ap_ 15KB
classes
net
kevin
util
RefreshListView.class 9KB
RefreshListView$ILoadMoreViewState.class 357B
MyListViewAdapter.class 2KB
RefreshListView$IOnRefreshListener.class 259B
RefreshListView$IOnLoadMoreListener.class 262B
RefreshListView$IListViewState.class 397B
demo
ListViewDemo.class 3KB
ListViewDemo$LoadMoreDataAsynTask.class 2KB
ListViewDemo$RefreshDataAsynTask.class 2KB
com
genius
test
R$string.class 418B
R$layout.class 489B
R$drawable.class 511B
R.class 555B
R$color.class 476B
BuildConfig.class 339B
R$attr.class 331B
R$id.class 735B
ListViewDemo.apk 25KB
classes.dex 15KB
proguard.cfg 1KB
.settings
org.eclipse.core.resources.prefs 88B
AndroidManifest.xml 745B
src
net
kevin
util
RefreshListView.java 12KB
MyListViewAdapter.java 1KB
demo
ListViewDemo.java 3KB
project.properties 361B
res
values
colors.xml 231B
strings.xml 168B
layout
head.xml 3KB
listview_item_layout.xml 576B
loadmore.xml 1KB
main.xml 578B
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
arrow.png 3KB
ic_launcher.png 4KB
drawable
load_more_selector.xml 307B
load_more_selected.xml 192B
drawable-mdpi
ic_launcher.png 3KB
.classpath 364B
gen
com
genius
test
R.java 2KB
BuildConfig.java 157B
共 50 条
- 1
资源评论
yxkfw
- 粉丝: 77
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 优化BP神经网络(GWO-BP)灰狼算法
- 基于vue+nodejs毕业设计-在线购物商城系统(源码+数据库+文档说明)
- python+django+博客+学习
- (灰狼算法)优化BP神经网络(GWO-BP)
- 000001~000030股票数据(上市至2017年7月5日)
- 人种黄种人白人黑人分类数据集970张4类别.7z
- 基于SpringBoot+Vue+MySql的网上图书商城(包括源码、数据库)高分毕设
- 车载显示引领座舱智能化,行业提质扩容在即
- 基于springboot+vue的网上书店系统源码+数据库+文档说明(高分毕设)
- 数据仓库与数据挖掘实验报告(python实现,包括关联规则、决策树、聚类分析、贝叶斯网络、神经网络和遗传算法的应用)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功