配色: 字号:
RecyclerView下拉刷新和上拉加载更多
2016-11-04 | 阅:  转:  |  分享 
  
RecyclerView下拉刷新和上拉加载更多



谷歌在v4包下提供了一个SwipeRefreshLayout来实现RecyclerView的下拉刷新,但是此类并不提供上拉加载更多的一个功能,网上有很多的博客实现了上拉加载,但是上拉的效果图和之前的一样,今天我就实现类似于SwipeRefreshLayout刷新的效果图。圆形进度条的实现类MaterialProgressDrawable,之后解决的就是什么时候让圆形进度条显示,如何让圆形进度条随着手指上下滑动。

就是在dispatchTouchEvent分发事件的时候,不断的去检测RecyclerView是否已经下拉到底部了,这时就让圆形进度条显示,如何再向上滑动就向上滑动,向下滑动就向下滑动,松开就计算滑动的高度是否符合加载的高度,符合就固定圆形进度条让其滚动,不符合就消失。



判断是否已经到底部了

[java]viewplaincopy

privatebooleancanPullUp(){

RecyclerView.LayoutManagerlm=mRecyclerView.getLayoutManager();

mLastVisiblePosition=getLastVisibleItemPosition();

intcount=mRecyclerView.getAdapter().getItemCount();

if(0==count){

//没有item的时候可以上拉加载

returntrue;

}elseif(mLastVisiblePosition==(count-1)){

//滑到底部了可以上拉加载

if(lm.findViewByPosition(count-1).getBottom()<=getMeasuredHeight()){

returntrue;

}

}

returnfalse;

}





不断检测滑动的位置,显示圆形进度条的位置

[java]viewplaincopy

@Override

publicbooleandispatchTouchEvent(MotionEventevent){



if(!mIsAllowLoadMore)returnsuper.dispatchTouchEvent(event);



switch(event.getAction()){

caseMotionEvent.ACTION_DOWN:

mStartY=(int)event.getRawY();

break;

caseMotionEvent.ACTION_MOVE:



if(!mStart){

//如果不满足上拉的条件就直接分发事件

if(!canPullUp()){

returnsuper.dispatchTouchEvent(event);

}

if(canPullUp()&&!mIsCanScoll){

showRefreshArrow();

mStartY=(int)event.getRawY();

mIsCanScoll=true;

}else{

//mStartY=(int)event.getRawY();

//hideRefreshArrow();

//hide();

}

if(mVisibleCanScoll){

intendY=(int)event.getRawY();

intoffset=mStartY-endY;

//System.out.println("----------------------offset:"+offset);

LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();

intbottomMargin=lp.bottomMargin;

bottomMargin+=offset;

if(bottomMargin>=PULL_IMAGE_SIZE_PX_MAX){

bottomMargin=PULL_IMAGE_SIZE_PX_MAX;

}



if(bottomMargin<=-PULL_IMAGE_SIZE_PX){

bottomMargin=-PULL_IMAGE_SIZE_PX;



}

lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,bottomMargin);

mImageView.setLayoutParams(lp);



rotateAniamtor(bottomMarginROTATE_ANIM_ANGLE_PER);



mStartY=endY;

}



LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();

//如果按住上拉时,上拉箭头向下滑动的时候事件不应分发

if(mVisable&&lp.bottomMargin>-PULL_IMAGE_SIZE_PX){

mIsDispatch=false;

}elseif(mVisable&&lp.bottomMargin==-PULL_IMAGE_SIZE_PX){//等到上拉箭头被隐藏掉的时候在分发事件

mIsDispatch=true;

}



//是否分发事件

if(!mIsDispatch){

returnfalse;

}

else{

returnsuper.dispatchTouchEvent(event);

}

}

break;



caseMotionEvent.ACTION_UP:

caseMotionEvent.ACTION_CANCEL:



if(!mStart){



if(mVisibleCanScoll){

LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();

if(lp.bottomMargin>=PULL_IMAGE_SIZE_PX_EXECUTE){

//lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,PULL_IMAGE_SIZE_PX/32);

//mImageView.setLayoutParams(lp);

//start();

getValueToTranslation();

mPrepareAnimation=true;



if(mOnPullListener!=null){

mOnPullListener.onLoadMore(this);

}

}else{



hideArrow();



}

}

if(!mStart&&!mPrepareAnimation)

hideArrow();

}



mIsCanScoll=false;



break;

}



returnsuper.dispatchTouchEvent(event);

}







当上拉松开时会有一个滑动的动画

[java]viewplaincopy

/

执行平移动画

@paramfrom

@paramto

/

privatevoidtranslationTo(intfrom,intto,finalbooleanisShow){

//1.调用ofInt(int...values)方法创建ValueAnimator对象

ValueAnimatormAnimator=ValueAnimator.ofInt(from,to);

//2.为目标对象的属性变化设置监听器

mAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){



@Override

publicvoidonAnimationUpdate(ValueAnimatoranimation){

//3.为目标对象的属性设置计算好的属性值

intanimatorValue=(int)animation.getAnimatedValue();

MarginLayoutParamsmarginLayoutParams=(MarginLayoutParams)mImageView.getLayoutParams();

marginLayoutParams.bottomMargin=animatorValue;

mImageView.setLayoutParams(marginLayoutParams);

}

});

mAnimator.addListener(newAnimatorListenerAdapter(){

@Override

publicvoidonAnimationEnd(Animatoranimation){

super.onAnimationEnd(animation);

if(isShow){

start();

mPrepareAnimation=false;

}else{

hideRefreshArrow();

hide();

}



}

});

//4.设置动画的持续时间、是否重复及重复次数等属性

mAnimator.setDuration(100);

//mAnimator.setRepeatCount(3);

mAnimator.setRepeatMode(ValueAnimator.INFINITE);

//5.为ValueAnimator设置目标对象并开始执行动画

mAnimator.setTarget(mImageView);

mAnimator.start();

}







圆形进度条随着滑动的距离产生旋转动画

[html]viewplaincopy

/

旋转动画效果

/

privatevoidrotateAniamtor(floatfrom){



ObjectAnimatormAnimatorRotate=ObjectAnimator.ofFloat(mImageView,"rotation",from,from+1);

mAnimatorRotate.setRepeatMode(Animation.INFINITE);

mAnimatorRotate.setRepeatCount(1);

mAnimatorRotate.setDuration(10);

mAnimatorRotate.start();

}







圆形进度条的阴影背景实现

[java]viewplaincopy

/

mImageView的背景

/

privateDrawablegetShapeDrawable(){

/






>








android:width="0.5dp"

android:color="#99f5f5f5"/>








android:left="2dp"

android:top="2dp"

android:bottom="2dp"

android:right="2dp">















/

//代码实现

GradientDrawablegradientDrawable=newGradientDrawable();

gradientDrawable.setShape(GradientDrawable.OVAL);

gradientDrawable.setColor(Color.parseColor("#f5f5f5"));

intstroke=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,0.5f,getContext().getResources().getDisplayMetrics());

gradientDrawable.setStroke(stroke,Color.parseColor("#99f5f5f5"));

GradientDrawablegradientDrawable2=newGradientDrawable();

gradientDrawable2.setShape(GradientDrawable.OVAL);

gradientDrawable2.setColor(Color.parseColor("#ffffff"));

LayerDrawabledrawable=newLayerDrawable(newDrawable[]{gradientDrawable,gradientDrawable2});

intpadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,2,getContext().getResources().getDisplayMetrics());

drawable.setLayerInset(1,padding,padding,padding,padding);////第一个参数1代表数组的第二个元素,为白色

returndrawable;

}



好了,源码就分析到这,如果发现bug或者有任何意见欢迎留言。



源码:

[java]viewplaincopy

packagecom.cj.recyclerview.refresh;



importandroid.animation.Animator;

importandroid.animation.AnimatorListenerAdapter;

importandroid.animation.ObjectAnimator;

importandroid.animation.ValueAnimator;

importandroid.content.Context;

importandroid.content.res.Resources;

importandroid.graphics.Color;

importandroid.graphics.drawable.Drawable;

importandroid.graphics.drawable.GradientDrawable;

importandroid.graphics.drawable.LayerDrawable;

importandroid.support.annotation.ColorRes;

importandroid.support.v4.widget.SwipeRefreshLayout;

importandroid.support.v7.widget.GridLayoutManager;

importandroid.support.v7.widget.LinearLayoutManager;

importandroid.support.v7.widget.RecyclerView;

importandroid.support.v7.widget.StaggeredGridLayoutManager;

importandroid.util.AttributeSet;

importandroid.util.TypedValue;

importandroid.view.MotionEvent;

importandroid.view.View;

importandroid.view.ViewGroup;

importandroid.view.animation.Animation;

importandroid.view.animation.DecelerateInterpolator;

importandroid.widget.ImageView;

importandroid.widget.RelativeLayout;



/

Createdbychenjon2016/9/28.

/

publicclassPullRefreshLayoutextendsRelativeLayout{



privateint[]colors={

0xFFFF0000,0xFFFF7F00,0xFFFFFF00,0xFF00FF00

,0xFF00FFFF,0xFF0000FF,0xFF8B00FF};



privatefinalintCIRCLE_BG_LIGHT=0xFFFAFAFA;



privateMaterialProgressDrawablemProgress;



privateValueAnimatormValueAnimator;



privatebooleanmStart=false;



privatebooleanmVisable=false;



privatestaticfinalintPULL_IMAGE_SIZE=40;

privatestaticintPULL_IMAGE_SIZE_PX;//上拉View的大小(像素)

privatestaticintPULL_IMAGE_SIZE_PX_MAX;//最大拉动的距离

privatestaticintPULL_IMAGE_SIZE_PX_EXECUTE;//拉动到什么位置开始执行

privatestaticintPULL_IMAGE_SIZE_PX_EXECUTE_REFRESH;//刷新是所在的位置

privatestaticfloatROTATE_ANIM_ANGLE_PER;//根据最大距离计算旋转角度的比列



privateImageViewmImageView;

privatebooleanmIsFirst;



privateintmStartY,mLastY;

privateRecyclerViewmRecyclerView;

//privateintmFirstVisiblePosition;

privateintmLastVisiblePosition;



privatebooleanmIsCanScoll;



privatebooleanmVisibleCanScoll;



privatebooleanmPrepareAnimation;//准备执行动画



privatebooleanmIsAllowLoadMore=true;//是否可以上拉刷新



privatebooleanmIsDispatch=true;//是否分发事件



publicPullRefreshLayout(Contextcontext){

this(context,null);

}



publicPullRefreshLayout(Contextcontext,AttributeSetattrs){

this(context,attrs,0);

}



publicPullRefreshLayout(Contextcontext,AttributeSetattrs,intdefStyleAttr){

super(context,attrs,defStyleAttr);





}



/

是否允许下拉加载更多

@paramallowLoadMore

/

publicvoidsetAllowLoadMore(booleanallowLoadMore){

mIsAllowLoadMore=allowLoadMore;

}



publicbooleanisAllowLoadMore(){

returnmIsAllowLoadMore;

}



/

设置进度圈的颜色

@paramcolors如:0xFFFF0000

/

publicvoidsetColorSchemeColors(int...colors){

this.colors=colors;

}

/

设置进度圈的颜色

@paramcolorResIds如:R.color.red

/

publicvoidsetColorSchemeResources(@ColorResint...colorResIds){

finalResourcesres=getResources();

int[]colorRes=newint[colorResIds.length];

for(inti=0;i
colorRes[i]=res.getColor(colorResIds[i]);

}

setColorSchemeColors(colorRes);

}



@Override

protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){

super.onLayout(changed,l,t,r,b);



if(!mIsFirst){



createProgressView();



over:

for(inti=0;i
ViewchildView=getChildAt(i);

if(childViewinstanceofSwipeRefreshLayout){

ViewGroupviewGroup=(ViewGroup)childView;

for(intj=0;j
ViewchildViewJ=viewGroup.getChildAt(j);

if(childViewJinstanceofRecyclerView){

mRecyclerView=(RecyclerView)childViewJ;

breakover;

}

}

}

if(childViewinstanceofRecyclerView){

mRecyclerView=(RecyclerView)childView;

breakover;

}

}

mIsFirst=true;

}

}





@Override

publicbooleandispatchTouchEvent(MotionEventevent){



if(!mIsAllowLoadMore)returnsuper.dispatchTouchEvent(event);



switch(event.getAction()){

caseMotionEvent.ACTION_DOWN:

mStartY=(int)event.getRawY();

break;

caseMotionEvent.ACTION_MOVE:



if(!mStart){

//如果不满足上拉的条件就直接分发事件

if(!canPullUp()){

returnsuper.dispatchTouchEvent(event);

}

if(canPullUp()&&!mIsCanScoll){

showRefreshArrow();

mStartY=(int)event.getRawY();

mIsCanScoll=true;

}else{

//mStartY=(int)event.getRawY();

//hideRefreshArrow();

//hide();

}

if(mVisibleCanScoll){

intendY=(int)event.getRawY();

intoffset=mStartY-endY;

//System.out.println("----------------------offset:"+offset);

LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();

intbottomMargin=lp.bottomMargin;

bottomMargin+=offset;

if(bottomMargin>=PULL_IMAGE_SIZE_PX_MAX){

bottomMargin=PULL_IMAGE_SIZE_PX_MAX;

}



if(bottomMargin<=-PULL_IMAGE_SIZE_PX){

bottomMargin=-PULL_IMAGE_SIZE_PX;



}

lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,bottomMargin);

mImageView.setLayoutParams(lp);



rotateAniamtor(bottomMarginROTATE_ANIM_ANGLE_PER);



mStartY=endY;

}



LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();

//如果按住上拉时,上拉箭头向下滑动的时候事件不应分发

if(mVisable&&lp.bottomMargin>-PULL_IMAGE_SIZE_PX){

mIsDispatch=false;

}elseif(mVisable&&lp.bottomMargin==-PULL_IMAGE_SIZE_PX){//等到上拉箭头被隐藏掉的时候在分发事件

mIsDispatch=true;

}



//是否分发事件

if(!mIsDispatch){

returnfalse;

}

else{

returnsuper.dispatchTouchEvent(event);

}

}

break;



caseMotionEvent.ACTION_UP:

caseMotionEvent.ACTION_CANCEL:



if(!mStart){



if(mVisibleCanScoll){

LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();

if(lp.bottomMargin>=PULL_IMAGE_SIZE_PX_EXECUTE){

//lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,PULL_IMAGE_SIZE_PX/32);

//mImageView.setLayoutParams(lp);

//start();

getValueToTranslation();

mPrepareAnimation=true;



if(mOnPullListener!=null){

mOnPullListener.onLoadMore(this);

}

}else{



hideArrow();



}

}

if(!mStart&&!mPrepareAnimation)

hideArrow();

}



mIsCanScoll=false;



break;

}



returnsuper.dispatchTouchEvent(event);

}



privatevoidhideArrow(){

LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();

//lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,-PULL_IMAGE_SIZE_PX);

//mImageView.setLayoutParams(lp);



translationTo(lp.bottomMargin,-PULL_IMAGE_SIZE_PX,false);



}



privatevoidshowRefreshArrow(){

mImageView.setVisibility(View.VISIBLE);



visable();

}



/

隐藏箭头显示的载体ImageView

/

privatevoidhideRefreshArrow(){

mImageView.setVisibility(View.GONE);

}





privatebooleancanPullUp(){

if(mRecyclerView==null||mRecyclerView.getAdapter()==null)returnfalse;

RecyclerView.LayoutManagerlm=mRecyclerView.getLayoutManager();

mLastVisiblePosition=getLastVisibleItemPosition();

intcount=mRecyclerView.getAdapter().getItemCount();

if(0==cwww.sm136.comount){

//没有item的时候也可以上拉加载

returntrue;

}elseif(mLastVisiblePosition==(count-1)){

//滑到底部了

if(lm.findViewByPosition(count-1).getBottom()<=getMeasuredHeight()){

returntrue;

}

}

returnfalse;

}







/

获取底部可见项的位置



@return

/

privateintgetLastVisibleItemPosition(){

RecyclerView.LayoutManagerlm=mRecyclerView.getLayoutManager();

intlastVisibleItemPosition=0;

if(lminstanceofGridLayoutManager){

lastVisibleItemPosition=((GridLayoutManager)lm).findLastVisibleItemPosition();

}elseif(lminstanceofLinearLayoutManager){

lastVisibleItemPosition=((LinearLayoutManager)lm).findLastVisibleItemPosition();

}

returnlastVisibleItemPosition;

}





/

创建刷新View和初始化一些数据

/

privatevoidcreateProgressView(){

mImageView=newImageView(getContext());



intsize=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,PULL_IMAGE_SIZE,getContext().getResources().getDisplayMetrics());

PULL_IMAGE_SIZE_PX=size;

PULL_IMAGE_SIZE_PX_MAX=PULL_IMAGE_SIZE_PX2;

PULL_IMAGE_SIZE_PX_EXECUTE=PULL_IMAGE_SIZE_PX;

PULL_IMAGE_SIZE_PX_EXECUTE_REFRESH=PULL_IMAGE_SIZE_PX/32;

ROTATE_ANIM_ANGLE_PER=(360.0f/PULL_IMAGE_SIZE_PX_MAX);

LayoutParamslp=newLayoutParams(size,size);

lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

lp.addRule(RelativeLayout.CENTER_HORIZONTAL);

lp.setMargins(lp.leftMargin,lp.topMargin,lp.rightMargin,-PULL_IMAGE_SIZE_PX);

mImageView.setLayoutParams(lp);

mImageView.setBackground(getShapeDrawable());



addView(mImageView);

mImageView.setVisibility(View.GONE);



mProgress=newMaterialProgressDrawable(getContext(),mImageView);



mProgress.setBackgroundColor(CIRCLE_BG_LIGHT);

//圈圈颜色,可以是多种颜色

mProgress.setColorSchemeColors(colors);

//设置圈圈的各种大小

mProgress.updateSizes(MaterialProgressDrawable.LARGE);



mImageView.setImageDrawable(mProgress);

}



/

mImageView的背景

/

privateDrawablegetShapeDrawable(){

/






>








android:width="0.5dp"

android:color="#99f5f5f5"/>








android:left="2dp"

android:top="2dp"

android:bottom="2dp"

android:right="2dp">















/

//代码实现

GradientDrawablegradientDrawable=newGradientDrawable();

gradientDrawable.setShape(GradientDrawable.OVAL);

gradientDrawable.setColor(Color.parseColor("#f5f5f5"));

intstroke=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,0.5f,getContext().getResources().getDisplayMetrics());

gradientDrawable.setStroke(stroke,Color.parseColor("#99f5f5f5"));

GradientDrawablegradientDrawable2=newGradientDrawable();

gradientDrawable2.setShape(GradientDrawable.OVAL);

gradientDrawable2.setColor(Color.parseColor("#ffffff"));

LayerDrawabledrawable=newLayerDrawable(newDrawable[]{gradientDrawable,gradientDrawable2});

intpadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,2,getContext().getResources().getDiwww.shanxiwang.netsplayMetrics());

drawable.setLayerInset(1,padding,padding,padding,padding);////第一个参数1代表数组的第二个元素,为白色

returndrawable;

}



/

隐藏箭头

/

privatevoidhide(){

if(mValueAnimator!=null){

mValueAnimator.cancel();

mVisable=false;

mVisibleCanScoll=false;

}



}



privatevoidvisable(){

if(mValueAnimator==null){

mValueAnimator=mValueAnimator.ofFloat(0f,1f);

mValueAnimator.setDuration(10);

mValueAnimator.setInterpolator(newDecelerateInterpolator());

mValueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){

@Override

publicvoidonAnimationUpdate(ValueAnimatoranimation){

floatn=(float)animation.getAnimatedValue();

//圈圈的旋转角度

mProgress.setProgressRotation(n0.5f);

//圈圈周长,0f-1F

mProgress.setStartEndTrim(0f,n0.8f);

//箭头大小,0f-1F

mProgress.setArrowScale(n);

//透明度,0-255

mProgress.setAlpha((int)(255n));

}

});

mValueAnimator.addListener(newAnimatorListenerAdapter(){

@Override

publicvoidonAnimationEnd(Animatoranimation){

super.onAnimationEnd(animation);

mVisable=true;



}

});

}



if(!mValueAnimator.isRunning()){

if(!mVisable){

//是否显示箭头

mProgress.showArrow(true);

mValueAnimator.start();

mVisibleCanScoll=true;

}

}

}



privatevoidstart(){

if(mVisable){

if(!mStart){

mProgress.start();



mStart=true;



}

}

}



/

计算执行动画的距离参数

/

privatevoidgetValueToTranslation(){

//如果mImageView还没有被创建出来是不会执行的

if(mImageView!=null){

LayoutParamslp=(LayoutParams)mImageView.getLayoutParams();

intbottomMargin=lp.bottomMargin;

//执行平移

translationTo(bottomMargin,PULL_IMAGE_SIZE_PX_EXECUTE_REFRESH,true);

}

}



privatevoidstop(){

if(mStart){

mProgress.stop();

mStart=false;

mVisable=false;

mVisibleCanScoll=false;

}

}





/

执行平移动画

@paramfrom

@paramto

/

privatevoidtranslationTo(intfrom,intto,finalbooleanisShow){

//1.调用ofInt(int...values)方法创建ValueAnimator对象

ValueAnimatormAnimator=ValueAnimator.ofInt(from,to);

//2.为目标对象的属性变化设置监听器

mAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){



@Override

publicvoidonAnimationUpdate(ValueAnimatoranimation){

//3.为目标对象的属性设置计算好的属性值

intanimatorValue=(int)animation.getAnimatedValue();

MarginLayoutParamsmarginLayoutParams=(MarginLayoutParams)mImageView.getLayoutParams();

marginLayoutParams.bottomMargin=animatorValue;

mImageView.setLayoutParams(marginLayoutParams);

}

});

mAnimator.addListener(newAnimatorListenerAdapter(){

@Override

publicvoidonAnimationEnd(Animatoranimation){

super.onAnimationEnd(animation);

if(isShow){

start();

mPrepareAnimation=false;

}else{

hideRefreshArrow();

hide();

}



}

});

//4.设置动画的持续时间、是否重复及重复次数等属性

mAnimator.setDuration(100);

//mAnimator.setRepeatCount(3);

mAnimator.setRepeatMode(ValueAnimator.INFINITE);

//5.为ValueAnimator设置目标对象并开始执行动画

mAnimator.setTarget(mImageView);

mAnimator.start();

}



/

旋转动画效果

/

privatevoidrotateAniamtor(floatfrom){



ObjectAnimatormAnimatorRotate=ObjectAnimator.ofFloat(mImageView,"rotation",from,from+1);

mAnimatorRotate.setRepeatMode(Animation.INFINITE);

mAnimatorRotate.setRepeatCount(1);

mAnimatorRotate.setDuration(10);

mAnimatorRotate.start();

}





/

加载更多或停止加载更多

@paramrefreshing

/

publicvoidsetRefreshing(booleanrefreshing){

if(!mIsAllowLoadMore)return;

if(refreshing){

if(mStart)return;

showRefreshArrow();

getValueToTranslation();

mPrepareAnimation=true;



if(mOnPullListener!=null){

mOnPullListener.onLoadMore(this);

}

mIsCanScoll=false;

}else{

stop();

hideArrow();

}

}



/

当前是否在上拉刷新

@return

/

publicbooleanisRefreshing(){

returnmStart;

}





/

刷新加载回调接口



/

publicinterfaceOnPullListener{



/

加载操作

/

voidonLoadMore(PullRefreshLayoutpullRefreshLayout);

}



privateOnPullListenermOnPullListener;



publicvoidsetOnPullListener(OnPullListenerlistener){

mOnPullListener=listener;

}



}





好了,和下拉刷新的动画一样的效果终于实现了。

献花(0)
+1
(本文系网络学习天...首藏)