android编程之下拉刷新实现方法分析
本文实例讲述了android编程之下拉刷新实现方法。分享给大家供大家参考,具体如下:
现在android应用里面下拉刷新比较多,今天自己研究一下相关的资料
publicclassMyListViewextendsListViewimplementsOnScrollListener{
privatestaticfinalStringTAG="listview";
privatefinalstaticintRELEASE_To_REFRESH=0;
privatefinalstaticintPULL_To_REFRESH=1;
privatefinalstaticintREFRESHING=2;
privatefinalstaticintDONE=3;
privatefinalstaticintLOADING=4;
//实际的padding的距离与界面上偏移距离的比例
privatefinalstaticintRATIO=3;
privateLayoutInflaterinflater;
privateLinearLayoutheadView;
privateTextViewtipsTextview;
privateTextViewlastUpdatedTextView;
privateImageViewarrowImageView;
privateProgressBarprogressBar;
privateRotateAnimationanimation;
privateRotateAnimationreverseAnimation;
//用于保证startY的值在一个完整的touch事件中只被记录一次
privatebooleanisRecored;
privateintheadContentWidth;
privateintheadContentHeight;
privateintstartY;
privateintfirstItemIndex;
privateintstate;
privatebooleanisBack;
privateOnRefreshListenerrefreshListener;
privatebooleanisRefreshable;
publicMyListView(Contextcontext){
super(context);
init(context);
}
publicMyListView(Contextcontext,AttributeSetattrs){
super(context,attrs);
init(context);
}
privatevoidinit(Contextcontext){
setCacheColorHint(context.getResources().getColor(R.color.transparent));
inflater=LayoutInflater.from(context);
headView=(LinearLayout)inflater.inflate(R.layout.head,null);
arrowImageView=(ImageView)headView
.findViewById(R.id.head_arrowImageView);
arrowImageView.setMinimumWidth(70);
arrowImageView.setMinimumHeight(50);
progressBar=(ProgressBar)headView
.findViewById(R.id.head_progressBar);
tipsTextview=(TextView)headView.findViewById(R.id.head_tipsTextView);
lastUpdatedTextView=(TextView)headView
.findViewById(R.id.head_lastUpdatedTextView);
measureView(headView);
headContentHeight=headView.getMeasuredHeight();
headContentWidth=headView.getMeasuredWidth();
headView.setPadding(0,-1*headContentHeight,0,0);
headView.invalidate();
Log.v("size","width:"+headContentWidth+"height:"
+headContentHeight);
addHeaderView(headView,null,false);
setOnScrollListener(this);
animation=newRotateAnimation(0,-180,
RotateAnimation.RELATIVE_TO_SELF,0.5f,
RotateAnimation.RELATIVE_TO_SELF,0.5f);
animation.setInterpolator(newLinearInterpolator());
animation.setDuration(250);
animation.setFillAfter(true);
reverseAnimation=newRotateAnimation(-180,0,
RotateAnimation.RELATIVE_TO_SELF,0.5f,
RotateAnimation.RELATIVE_TO_SELF,0.5f);
reverseAnimation.setInterpolator(newLinearInterpolator());
reverseAnimation.setDuration(200);
reverseAnimation.setFillAfter(true);
state=DONE;
isRefreshable=false;
}
publicvoidonScroll(AbsListViewarg0,intfirstVisiableItem,intarg2,
intarg3){
firstItemIndex=firstVisiableItem;
}
publicvoidonScrollStateChanged(AbsListViewarg0,intarg1){
}
publicbooleanonTouchEvent(MotionEventevent){
if(isRefreshable){
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
if(firstItemIndex==0&&!isRecored){
isRecored=true;
startY=(int)event.getY();
Log.v(TAG,"在down时候记录当前位置‘");
}
break;
caseMotionEvent.ACTION_UP:
if(state!=REFRESHING&&state!=LOADING){
if(state==DONE){
//什么都不做
}
if(state==PULL_To_REFRESH){
state=DONE;
changeHeaderViewByState();
Log.v(TAG,"由下拉刷新状态,到done状态");
}
if(state==RELEASE_To_REFRESH){
state=REFRESHING;
changeHeaderViewByState();
onRefresh();
Log.v(TAG,"由松开刷新状态,到done状态");
}
}
isRecored=false;
isBack=false;
break;
caseMotionEvent.ACTION_MOVE:
inttempY=(int)event.getY();
if(!isRecored&&firstItemIndex==0){
Log.v(TAG,"在move时候记录下位置");
isRecored=true;
startY=tempY;
}
if(state!=REFRESHING&&isRecored&&state!=LOADING){
//保证在设置padding的过程中,当前的位置一直是在head,否则如果当列表超出屏幕的话,当在上推的时候,列表会同时进行滚动
//可以松手去刷新了
if(state==RELEASE_To_REFRESH){
setSelection(0);
//往上推了,推到了屏幕足够掩盖head的程度,但是还没有推到全部掩盖的地步
if(((tempY-startY)/RATIO<headContentHeight)
&&(tempY-startY)>0){
state=PULL_To_REFRESH;
changeHeaderViewByState();
Log.v(TAG,"由松开刷新状态转变到下拉刷新状态");
}
//一下子推到顶了
elseif(tempY-startY<=0){
state=DONE;
changeHeaderViewByState();
Log.v(TAG,"由松开刷新状态转变到done状态");
}
//往下拉了,或者还没有上推到屏幕顶部掩盖head的地步
else{
//不用进行特别的操作,只用更新paddingTop的值就行了
}
}
//还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态
if(state==PULL_To_REFRESH){
setSelection(0);
//下拉到可以进入RELEASE_TO_REFRESH的状态
if((tempY-startY)/RATIO>=headContentHeight){
state=RELEASE_To_REFRESH;
isBack=true;
changeHeaderViewByState();
Log.v(TAG,"由done或者下拉刷新状态转变到松开刷新");
}
//上推到顶了
elseif(tempY-startY<=0){
state=DONE;
changeHeaderViewByState();
Log.v(TAG,"由DOne或者下拉刷新状态转变到done状态");
}
}
//done状态下
if(state==DONE){
if(tempY-startY>0){
state=PULL_To_REFRESH;
changeHeaderViewByState();
}
}
//更新headView的size
if(state==PULL_To_REFRESH){
headView.setPadding(0,-1*headContentHeight
+(tempY-startY)/RATIO,0,0);
}
//更新headView的paddingTop
if(state==RELEASE_To_REFRESH){
headView.setPadding(0,(tempY-startY)/RATIO
-headContentHeight,0,0);
}
}
break;
}
}
returnsuper.onTouchEvent(event);
}
//当状态改变时候,调用该方法,以更新界面
privatevoidchangeHeaderViewByState(){
switch(state){
caseRELEASE_To_REFRESH:
arrowImageView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
tipsTextview.setVisibility(View.VISIBLE);
lastUpdatedTextView.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.startAnimation(animation);
tipsTextview.setText("松开刷新");
Log.v(TAG,"当前状态,松开刷新");
break;
casePULL_To_REFRESH:
progressBar.setVisibility(View.GONE);
tipsTextview.setVisibility(View.VISIBLE);
lastUpdatedTextView.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.setVisibility(View.VISIBLE);
//是由RELEASE_To_REFRESH状态转变来的
if(isBack){
isBack=false;
arrowImageView.clearAnimation();
arrowImageView.startAnimation(reverseAnimation);
tipsTextview.setText("下拉刷新");
}else{
tipsTextview.setText("下拉刷新");
}
Log.v(TAG,"当前状态,下拉刷新");
break;
caseREFRESHING:
headView.setPadding(0,0,0,0);
progressBar.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.setVisibility(View.GONE);
tipsTextview.setText("正在刷新...");
lastUpdatedTextView.setVisibility(View.VISIBLE);
Log.v(TAG,"当前状态,正在刷新...");
break;
caseDONE:
headView.setPadding(0,-1*headContentHeight,0,0);
progressBar.setVisibility(View.GONE);
arrowImageView.clearAnimation();
arrowImageView.setImageResource(R.drawable.arrow);
tipsTextview.setText("下拉刷新");
lastUpdatedTextView.setVisibility(View.VISIBLE);
Log.v(TAG,"当前状态,done");
break;
}
}
publicvoidsetonRefreshListener(OnRefreshListenerrefreshListener){
this.refreshListener=refreshListener;
isRefreshable=true;
}
publicinterfaceOnRefreshListener{
publicvoidonRefresh();
}
publicvoidonRefreshComplete(){
state=DONE;
lastUpdatedTextView.setText("最近更新:"+newDate().toLocaleString());
changeHeaderViewByState();
}
privatevoidonRefresh(){
if(refreshListener!=null){
refreshListener.onRefresh();
}
}
//此方法直接照搬自网络上的一个下拉刷新的demo,此处是“估计”headView的width以及height
privatevoidmeasureView(Viewchild){
ViewGroup.LayoutParamsp=child.getLayoutParams();
if(p==null){
p=newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
intchildWidthSpec=ViewGroup.getChildMeasureSpec(0,0+0,p.width);
intlpHeight=p.height;
intchildHeightSpec;
if(lpHeight>0){
childHeightSpec=MeasureSpec.makeMeasureSpec(lpHeight,
MeasureSpec.EXACTLY);
}else{
childHeightSpec=MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec,childHeightSpec);
}
publicvoidsetAdapter(BaseAdapteradapter){
lastUpdatedTextView.setText("最近更新:"+newDate().toLocaleString());
super.setAdapter(adapter);
}
}
希望本文所述对大家Android程序设计有所帮助。