package com.aiven.widget;
import com.aiven.view.R.styleable;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.ListView;
/**
* @author Aiven
* @date 2012/07/27
* @ 上下加载ListView
* */
public class AppendList extends ListView implements OnScrollListener {
private static final int STATE_RELEASE_FRESH = 1001;// 释放刷新态
private static final int STATE_INTO_RELESE = 1002;// 未进入释放刷新态
private static final int STATE_REFRESHING = 1003;// 正在刷新态
private static final int STATE_DONE = 1004;// 初始态
public static final int DERECTION_UP = 1005;// 上加载
public static final int DERECTION_DOWN = 1006;// 底部加载
public boolean isHiddenFooter;
private int mState;
private View mHeadView;
private View mFootView;
private int mHeadHeight;
private int mFootHeight;
private int mHeadResouceId;
private int mFootResouceId;
// *** 记录ListView 当前显示信息 **/////////
private int mDataTotal;
private int mDataFirstIndex;
private int mDataViewCount;
private static final float RATIO = 2.8f;
private static final float RATIO2=1.4f;
private int mStartY;
private boolean mHeadRecard;
private boolean mFootRecard;
private boolean isBack;
private View mHeadAnimationView;
private View mFootAnimationView;
private Animation mHeadStartAnimation;
private Animation mHeadBackAnimation;
private Animation mFootStartAnimation;
private Animation mFootBackAnimation;
private OnLoadingListener mLoadingListener;
private View mClickView;
private int mClickViewId;
private MyClickListener myClickListener;
private OnAppItemClickListener mAppClickLitener;
private ItemClickLener mItemClickListener;
private int mListDataCount;//数据总数
private int mListDataIndex;//数据第一条索引
/***
* 属性说明:
* @headView:ListView的HeaderView对应的布局文件
* @footView:ListView的FooterView对应的布局文件
* @isHiddenFooter:boolean类型,默认为ture,是否隐藏底部FooterView
* @mClickViewId:当isHiddenFooter值为false的情况下,指定FooterView最外层布局的Id
* 作用是:isHiddenFooter为false的情况下只能点击加载,拖动不能加载,通腾讯微博列表
*
* @param context
* @param attrs
*/
public AppendList(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initialize();
TypedArray a = context.obtainStyledAttributes(attrs, styleable.APPList);
mHeadResouceId = a.getResourceId(styleable.APPList_headView, 0);
mFootResouceId = a.getResourceId(styleable.APPList_footView, 0);
isHiddenFooter = a.getBoolean(styleable.APPList_hiddenFooter,true);
mClickViewId = a.getResourceId(styleable.APPList_footerClickId,0);
initData(context);
}
private void initialize() {
// TODO Auto-generated method stub
mHeadView = null;
mFootView = null;
mHeadHeight = -1;
mFootHeight = -1;
mHeadResouceId = 0;
mFootResouceId = 0;
mState = STATE_DONE;
mHeadRecard = false;
mFootRecard = false;
mHeadAnimationView = null;
mFootAnimationView = null;
mClickView=null;
}
/**
* 初始化数据
* @param context
*/
private void initData(Context context) {
// TODO Auto-generated method stub
if (mHeadResouceId != 0) {
mHeadView = LayoutInflater.from(context).inflate(mHeadResouceId, null);
if (mHeadView != null) {
addHeaderView(mHeadView);
measureView(mHeadView);
mHeadHeight = mHeadView.getMeasuredHeight();
setPaddingTop(mHeadView, -1 * mHeadHeight);
}
}
if (mFootResouceId != 0) {
mFootView = LayoutInflater.from(context).inflate(mFootResouceId, null);
if (mFootView != null) {
addFooterView(mFootView);
measureView(mFootView);
mFootHeight = mFootView.getMeasuredHeight();
if(!isHiddenFooter){
//添加点击事件
showView(mFootView);
if(mClickViewId!=0){
mClickView=(View)findViewById(mClickViewId);
mClickView.setClickable(true);
myClickListener=new MyClickListener();
mClickView.setOnClickListener(myClickListener);
}
}else{
setPaddingTop(mFootView, -1 * mFootHeight);
}
}
}
setOnScrollListener(this);
mItemClickListener=new ItemClickLener();
setOnItemClickListener(mItemClickListener);
}
private void setPaddingTop(View view, int top) {
view.setPadding(0, top, 0, 0);
}
private void setPadddingBottom(View view,int bottom){
view.setPadding(0,0, 0,bottom);
}
private void showView(View view) {
view.setPadding(0, 0, 0, 0);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
if (mHeadView == null && mFootView == null)
return super.onTouchEvent(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!mHeadRecard && mDataFirstIndex == 0 && !mFootRecard) {
mHeadRecard = true;
mFootRecard=false;
mStartY = (int) ev.getY();
}
if (!mFootRecard && mDataFirstIndex == mDataTotal - mDataViewCount && !mHeadRecard) {
mFootRecard = true;
mHeadRecard = false;
mStartY = (int) ev.getY();
}
break;
case MotionEvent.ACTION_UP:
// 如果不在刷新的时刻
if (mState != STATE_REFRESHING) {
// 未达到刷新
if (mState == STATE_INTO_RELESE) {
// 修改状态为初始态
mState = STATE_DONE;
if(mHeadRecard)
changeHeadView();
else if(mFootRecard){
changeFootView();
}
}
// 进入刷新态
if (mState == STATE_RELEASE_FRESH) {
// 修改状态为刷新态
mState = STATE_REFRESHING;
if(mHeadRecard)
changeHeadView();
else if(mFootRecard){
changeFootView();
}
} else {
}
mHeadRecard = false;
mFootRecard=false;
} else {
}
break;
case MotionEvent.ACTION_MOVE:
int tempY = (int) ev.getY();
if (!mHeadRecard && mDataFirstIndex == 0 && !mFootRecard) {
mHeadRecard = true;
mFootRecard = false;
mStartY = tempY;
}