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;
}
}
好了,和下拉刷新的动画一样的效果终于实现了。
|
|