package com.aspsine.irecyclerview; import android.animation.Animator; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.TypedArray; import android.support.annotation.LayoutRes; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.FrameLayout; import android.widget.LinearLayout; import com.aspsine.irecyclerview.widget.LoadMoreFooterView; import com.jaydenxiao.common.commonutils.LogUtils; /** * Created by aspsine on 16/3/3. */ public class IRecyclerView extends RecyclerView { private static final String TAG = IRecyclerView.class.getSimpleName(); private static final int STATUS_DEFAULT = 0; private static final int STATUS_SWIPING_TO_REFRESH = 1; private static final int STATUS_RELEASE_TO_REFRESH = 2; private static final int STATUS_REFRESHING = 3; private static final boolean DEBUG = false; private int mStatus; private boolean mIsAutoRefreshing; private boolean mRefreshEnabled; private boolean mLoadMoreEnabled; private int mRefreshFinalMoveOffset; private OnRefreshListener mOnRefreshListener; private OnLoadMoreListener mOnLoadMoreListener; private OnLoadMoreScrollListener mOnLoadMoreScrollListener; private RefreshHeaderLayout mRefreshHeaderContainer; private FrameLayout mLoadMoreFooterContainer; private LinearLayout mHeaderViewContainer; private LinearLayout mFooterViewContainer; private View mRefreshHeaderView; private View mLoadMoreFooterView; @LayoutRes int refreshHeaderLayoutRes = -1; @LayoutRes int loadMoreFooterLayoutRes = -1; public IRecyclerView(Context context) { this(context, null); } public IRecyclerView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public IRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IRecyclerView, defStyle, 0); int refreshFinalMoveOffset = -1; boolean refreshEnabled; boolean loadMoreEnabled; try { refreshEnabled = a.getBoolean(R.styleable.IRecyclerView_refreshEnabled, false); loadMoreEnabled = a.getBoolean(R.styleable.IRecyclerView_loadMoreEnabled, false); refreshHeaderLayoutRes = a.getResourceId(R.styleable.IRecyclerView_refreshHeaderLayout, -1); loadMoreFooterLayoutRes = a.getResourceId(R.styleable.IRecyclerView_loadMoreFooterLayout, -1); refreshFinalMoveOffset = a.getDimensionPixelOffset(R.styleable.IRecyclerView_refreshFinalMoveOffset, -1); } finally { a.recycle(); } setRefreshEnabled(refreshEnabled); setLoadMoreEnabled(loadMoreEnabled); if (refreshHeaderLayoutRes != -1) { setRefreshHeaderView(refreshHeaderLayoutRes); } else if (refreshEnabled) { refreshHeaderLayoutRes = R.layout.layout_irecyclerview_classic_refresh_header; setRefreshHeaderView(refreshHeaderLayoutRes); } if (loadMoreFooterLayoutRes != -1) { setLoadMoreFooterView(loadMoreFooterLayoutRes); } else if (loadMoreEnabled) { loadMoreFooterLayoutRes = R.layout.layout_irecyclerview_load_more_footer; setLoadMoreFooterView(loadMoreFooterLayoutRes); } if (refreshFinalMoveOffset != -1) { setRefreshFinalMoveOffset(refreshFinalMoveOffset); } setStatus(STATUS_DEFAULT); } @Override protected void onMeasure(int widthSpec, int heightSpec) { super.onMeasure(widthSpec, heightSpec); if (mRefreshHeaderView != null) { if (mRefreshHeaderView.getMeasuredHeight() > mRefreshFinalMoveOffset) { mRefreshFinalMoveOffset = 0; } } } /** * 设置是否支持下拉刷新 默认:支持 * * @param enabled */ public void setRefreshEnabled(boolean enabled) { this.mRefreshEnabled = enabled; } /** * 设置是否支持上拉加载更多 默认:支持 * * @param enabled */ public void setLoadMoreEnabled(boolean enabled) { this.mLoadMoreEnabled = enabled; if (mLoadMoreEnabled) { if (mOnLoadMoreScrollListener == null) { mOnLoadMoreScrollListener = new OnLoadMoreScrollListener() { @Override public void onLoadMore(RecyclerView recyclerView) { if (mOnLoadMoreListener != null && mStatus == STATUS_DEFAULT) { mOnLoadMoreListener.onLoadMore(mLoadMoreFooterView); } } }; } else { removeOnScrollListener(mOnLoadMoreScrollListener); } addOnScrollListener(mOnLoadMoreScrollListener); } else { if (mLoadMoreFooterView != null) { removeLoadMoreFooterView(); } if (mOnLoadMoreScrollListener != null) { removeOnScrollListener(mOnLoadMoreScrollListener); } } } /** * 设置刷新监听 * * @param listener */ public void setOnRefreshListener(OnRefreshListener listener) { this.mOnRefreshListener = listener; } /** * 设置加载更多监听 * * @param listener */ public void setOnLoadMoreListener(OnLoadMoreListener listener) { this.mOnLoadMoreListener = listener; } /** * 设置刷新状态 * * @param refreshing */ public void setRefreshing(boolean refreshing) { if (mStatus == STATUS_DEFAULT && refreshing) { this.mIsAutoRefreshing = true; setStatus(STATUS_SWIPING_TO_REFRESH); startScrollDefaultStatusToRefreshingStatus(); } else if (mStatus == STATUS_REFRESHING && !refreshing) { this.mIsAutoRefreshing = false; startScrollRefreshingStatusToDefaultStatus(); } else { this.mIsAutoRefreshing = false; LogUtils.loge(TAG, "isRefresh = " + refreshing + " current status = " + mStatus); } } /** * 设置下拉触动刷新距离 * * @param refreshFinalMoveOffset */ public void setRefreshFinalMoveOffset(int refreshFinalMoveOffset) { this.mRefreshFinalMoveOffset = refreshFinalMoveOffset; } /** * 添加刷新header view * * @param refreshHeaderView */ public void setRefreshHeaderView(View refreshHeaderView) { if (!isRefreshTrigger(refreshHeaderView)) { throw new ClassCastException("Refresh header view must be an implement of RefreshTrigger"); } if (mRefreshHeaderView != null) { removeRefreshHeaderView(); } if (mRefreshHeaderView != refreshHeaderView) { this.mRefreshHeaderView = refreshHeaderView; ensureRefreshHeaderContainer(); mRefreshHeaderContainer.addView(refreshHeaderView); } } /** * 添加刷新header layout * * @param refreshHeaderLayoutRes */ public void setRefreshHeaderView(@LayoutRes int refreshHeaderLayoutRes) { ensureRefreshHeaderContainer(); final View refreshHeader = LayoutInflater.from(getContext()).inflate(refreshHeaderLayoutRes, mRefreshHeaderContainer, false); if (refreshHeader != null) { setRefreshHeaderView(refreshHeader); } } /** * 添加加载更多footer view * * @param loadMoreFooterView */ public void setLoadMoreFooterView(View loadMoreFooterView) { if (mLoadMoreFooterView != null) { removeLoadMoreFooterView(); } if (mLoadMoreFooterView != loadMoreFooterView) { this.mLoadMoreFooterView = loadMoreFooterView; ensureLoadMoreFooterContainer(); mLoadMoreFooterContainer.addView(loadMoreFooterView); } } /** * 添加加载更多footer layout * * @param loadMoreFooterLayoutRes */ public void setLoadMoreFooterView(@LayoutRes int loadMoreFooterLayoutRes) { ensureLoadMoreFooterContainer(); final View loadMoreFooter = LayoutInflater.from(getContext()).inflate(loadMoreFooterLayoutRes, mLoadMoreFooterContainer, false); if (loadMoreFooter != null) { setLoadMoreFooterView(loadMoreFooter); } } public View getRefreshHeaderView() { return mRefreshHeaderView; } public View getLoadMoreFooterView() { return mLoadMoreFooterView; } public LinearLayout getHeaderContainer() { ensureHeaderViewContainer(); return mHeaderViewContainer; } public LinearLayout getFooterContainer() { ensureFooterViewContainer(); return mFooterViewContainer; } public void removeHeaderAllView() { if(mHeaderViewContainer!=null) { mHeaderViewContainer.removeAllViews(); Adapter adapter = getAdapter(); if (adapter != null) { adapter.notifyItemChanged(1); } } } public void addHeaderView(View headerView) { ensureHeaderViewContainer(); mHeaderViewContainer.addView(headerView); Adapter adapter = getAdapter(); if (adapter != null) { adapter.notifyItemChanged(1); } } public void removeFooterView() { if(mFooterViewContainer!=null) { mFooterViewContainer.removeAllViews(); Adapter adapter = getAdapter(); if (adapter != null) { adapter.notifyItemChanged(adapter.getItemCount() - 2); } } } public void addFooterView(View footerView) { ensureFooterViewContainer(); mFooterViewContainer.addView(footerView); Adapter adapter = getAdapter(); if (adapter != null) { adapter.notifyItemChanged(adapter.getItemCount() - 2); } } public RecyclerView.Adapter getIAdapter() { final WrapperAdapter wrapperAdapter = (WrapperAdapter) getAdapter(); return wrapperAdapter.getAdapter(); } @Override public void setAdapter(Adapter adapter) { ensureRefreshHeaderContainer(); ensureHeaderViewContainer(); ensureFooterViewContainer(); ensureLoadMoreFooterContainer(); super.setAdapter(new WrapperAdapter(adapter, mRefreshHeaderContainer, mHeaderViewContainer, mFooterViewContainer, mLoadMoreFooterContainer)); } private void ensureRefreshHeaderContainer() { if (mRefreshHeaderContainer == null) { mRefreshHeaderContainer = new RefreshHeaderLayout(getContext()); mRefreshHeaderContainer.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0)); } } private void ensureLoadMoreFooterContainer() { if (mLoadMoreFooterContainer == null) { mLoadMoreFooterContainer = new FrameLayout(getContext()); mLoadMoreFooterContainer.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } } private void ensureHeaderViewContainer() { if (mHeaderViewContainer == null) { mHeaderViewContainer = new LinearLayout(getContext()); mHeaderViewContainer.setOrientation(LinearLayout.VERTICAL); mHeaderViewContainer.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } } private void ensureFooterViewContainer() { if (mFooterViewContainer == null) { mFooterViewContainer = new LinearLayout(getContext()); mFooterViewContainer.setOrientation(LinearLayout.VERTICAL); mFooterViewContainer.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } } private boolean isRefreshTrigger(View refreshHeaderView) { return refreshHeaderView instanceof RefreshTrigger; } private void removeRefreshHeaderView() { if (mRefreshHeaderContainer != null) { mRefreshHeaderContainer.removeView(mRefreshHeaderView); } } private void removeLoadMoreFooterView() { if (mLoadMoreFooterContainer != null) { mLoadMoreFooterContainer.removeView(mLoadMoreFooterView); } } private int mActivePointerId = -1; private int mLastTouchX = 0; private int mLastTouchY = 0; /** * 监听滑动手势 * * @param e * @return */ @Override public boolean onInterceptTouchEvent(MotionEvent e) { final int action = android.support.v4.view.MotionEventCompat.getActionMasked(e); final int actionIndex = android.support.v4.view.MotionEventCompat.getActionIndex(e); switch (action) { case MotionEvent.ACTION_DOWN: { mActivePointerId = android.support.v4.view.MotionEventCompat.getPointerId(e, 0); mLastTouchX = (int) (android.support.v4.view.MotionEventCompat.getX(e, actionIndex) + 0.5f); mLastTouchY = (int) (android.support.v4.view.MotionEventCompat.getY(e, actionIndex) + 0.5f); } break; case MotionEvent.ACTION_POINTER_DOWN: { mActivePointerId = android.support.v4.view.MotionEventCompat.getPointerId(e, actionIndex); mLastTouchX = (int) (android.support.v4.view.MotionEventCompat.getX(e, actionIndex) + 0.5f); mLastTouchY = (int) (android.support.v4.view.MotionEventCompat.getY(e, actionIndex) + 0.5f); } break; case android.support.v4.view.MotionEventCompat.ACTION_POINTER_UP: { onPointerUp(e); } break; } return super.onInterceptTouchEvent(e); } @Override public boolean onTouchEvent(MotionEvent e) { final int action = android.support.v4.view.MotionEventCompat.getActionMasked(e); switch (action) { case MotionEvent.ACTION_DOWN: { final int index = android.support.v4.view.MotionEventCompat.getActionIndex(e); mActivePointerId = android.support.v4.view.MotionEventCompat.getPointerId(e, 0); mLastTouchX = getMotionEventX(e, index); mLastTouchY = getMotionEventY(e, index); } break; case MotionEvent.ACTION_MOVE: { final int index = android.support.v4.view.MotionEventCompat.findPointerIndex(e, mActivePointerId); if (index < 0) { LogUtils.loge(TAG, "Error processing scroll; pointer index for id " + index + " not found. Did any MotionEvents get skipped?"); return false; } final int x = getMotionEventX(e, index); final int y = getMotionEventY(e, index); final int dx = x - mLastTouchX; final int dy = y - mLastTouchY; mLastTouchX = x; mLastTouchY = y; final boolean triggerCondition = isEnabled() && mRefreshEnabled && mRefreshHeaderView != null && isFingerDragging() && canTriggerRefresh(); if (DEBUG) { LogUtils.logi(TAG, "triggerCondition = " + triggerCondition + "; mStatus = " + mStatus + "; dy = " + dy); } if (triggerCondition) { final int refreshHeaderContainerHeight = mRefreshHeaderContainer.getMeasuredHeight(); final int refreshHeaderViewHeight = mRefreshHeaderView.getMeasuredHeight(); if (dy > 0 && mStatus == STATUS_DEFAULT) { setStatus(STATUS_SWIPING_TO_REFRESH); mRefreshTrigger.onStart(false, refreshHeaderViewHeight, mRefreshFinalMoveOffset); } else if (dy < 0) { if (mStatus == STATUS_SWIPING_TO_REFRESH && refreshHeaderContainerHeight <= 0) { setStatus(STATUS_DEFAULT); } if (mStatus == STATUS_DEFAULT) { break; } } if (mStatus == STATUS_SWIPING_TO_REFRESH || mStatus == STATUS_RELEASE_TO_REFRESH) { if (refreshHeaderContainerHeight >= refreshHeaderViewHeight) { setStatus(STATUS_RELEASE_TO_REFRESH); } else { setStatus(STATUS_SWIPING_TO_REFRESH); } fingerMove(dy); return true; } } } break; case android.support.v4.view.MotionEventCompat.ACTION_POINTER_DOWN: { final int index = android.support.v4.view.MotionEventCompat.getActionIndex(e); mActivePointerId = android.support.v4.view.MotionEventCompat.getPointerId(e, index); mLastTouchX = getMotionEventX(e, index); mLastTouchY = getMotionEventY(e, index); } break; case android.support.v4.view.MotionEventCompat.ACTION_POINTER_UP: { onPointerUp(e); } break; case MotionEvent.ACTION_UP: { onFingerUpStartAnimating(); } break; case MotionEvent.ACTION_CANCEL: { onFingerUpStartAnimating(); } break; } return super.onTouchEvent(e); } private boolean isFingerDragging() { return getScrollState() == SCROLL_STATE_DRAGGING; } public boolean canTriggerRefresh() { final Adapter adapter = getAdapter(); if (adapter == null || adapter.getItemCount() <= 0) { return true; } View firstChild = getChildAt(0); int position = getChildLayoutPosition(firstChild); if (position == 0) { if (firstChild.getTop() == mRefreshHeaderContainer.getTop()) { return true; } } return false; } private int getMotionEventX(MotionEvent e, int pointerIndex) { return (int) (android.support.v4.view.MotionEventCompat.getX(e, pointerIndex) + 0.5f); } private int getMotionEventY(MotionEvent e, int pointerIndex) { return (int) (android.support.v4.view.MotionEventCompat.getY(e, pointerIndex) + 0.5f); } private void fingerMove(int dy) { int ratioDy = (int) (dy * 0.5f + 0.5); int offset = mRefreshHeaderContainer.getMeasuredHeight(); int finalDragOffset = mRefreshFinalMoveOffset; int nextOffset = offset + ratioDy; if (finalDragOffset > 0) { if (nextOffset > finalDragOffset) { ratioDy = finalDragOffset - offset; } } if (nextOffset < 0) { ratioDy = -offset; } move(ratioDy); } private void move(int dy) { if (dy != 0) { int height = mRefreshHeaderContainer.getMeasuredHeight() + dy; setRefreshHeaderContainerHeight(height); mRefreshTrigger.onMove(false, false, height); } } private void setRefreshHeaderContainerHeight(int height) { mRefreshHeaderContainer.getLayoutParams().height = height; mRefreshHeaderContainer.requestLayout(); } private void startScrollDefaultStatusToRefreshingStatus() { mRefreshTrigger.onStart(true, mRefreshHeaderView.getMeasuredHeight(), mRefreshFinalMoveOffset); int targetHeight = mRefreshHeaderView.getMeasuredHeight(); int currentHeight = mRefreshHeaderContainer.getMeasuredHeight(); startScrollAnimation(400, new AccelerateInterpolator(), currentHeight, targetHeight); } private void startScrollSwipingToRefreshStatusToDefaultStatus() { final int targetHeight = 0; final int currentHeight = mRefreshHeaderContainer.getMeasuredHeight(); startScrollAnimation(300, new DecelerateInterpolator(), currentHeight, targetHeight); } private void startScrollReleaseStatusToRefreshingStatus() { mRefreshTrigger.onRelease(); final int targetHeight = mRefreshHeaderView.getMeasuredHeight(); final int currentHeight = mRefreshHeaderContainer.getMeasuredHeight(); startScrollAnimation(300, new DecelerateInterpolator(), currentHeight, targetHeight); } private void startScrollRefreshingStatusToDefaultStatus() { mRefreshTrigger.onComplete(); final int targetHeight = 0; final int currentHeight = mRefreshHeaderContainer.getMeasuredHeight(); startScrollAnimation(400, new DecelerateInterpolator(), currentHeight, targetHeight); } ValueAnimator mScrollAnimator; private void startScrollAnimation(final int time, final Interpolator interpolator, int value, int toValue) { if (mScrollAnimator == null) { mScrollAnimator = new ValueAnimator(); } //cancel mScrollAnimator.removeAllUpdateListeners(); mScrollAnimator.removeAllListeners(); mScrollAnimator.cancel(); //reset new value mScrollAnimator.setIntValues(value, toValue); mScrollAnimator.setDuration(time); mScrollAnimator.setInterpolator(interpolator); mScrollAnimator.addUpdateListener(mAnimatorUpdateListener); mScrollAnimator.addListener(mAnimationListener); mScrollAnimator.start(); } ValueAnimator.AnimatorUpdateListener mAnimatorUpdateListener = new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { final int height = (Integer) animation.getAnimatedValue(); setRefreshHeaderContainerHeight(height); switch (mStatus) { case STATUS_SWIPING_TO_REFRESH: { mRefreshTrigger.onMove(false, true, height); } break; case STATUS_RELEASE_TO_REFRESH: { mRefreshTrigger.onMove(false, true, height); } break; case STATUS_REFRESHING: { mRefreshTrigger.onMove(true, true, height); } break; } } }; Animator.AnimatorListener mAnimationListener = new SimpleAnimatorListener() { @Override public void onAnimationEnd(Animator animation) { int lastStatus = mStatus; switch (mStatus) { case STATUS_SWIPING_TO_REFRESH: { if (mIsAutoRefreshing) { mRefreshHeaderContainer.getLayoutParams().height = mRefreshHeaderView.getMeasuredHeight(); mRefreshHeaderContainer.requestLayout(); setStatus(STATUS_REFRESHING); if (mOnRefreshListener != null) { mOnRefreshListener.onRefresh(); mRefreshTrigger.onRefresh(); } } else { mRefreshHeaderContainer.getLayoutParams().height = 0; mRefreshHeaderContainer.requestLayout(); setStatus(STATUS_DEFAULT); } } break; case STATUS_RELEASE_TO_REFRESH: { mRefreshHeaderContainer.getLayoutParams().height = mRefreshHeaderView.getMeasuredHeight(); mRefreshHeaderContainer.requestLayout(); setStatus(STATUS_REFRESHING); if (mOnRefreshListener != null) { mOnRefreshListener.onRefresh(); mRefreshTrigger.onRefresh(); } } break; case STATUS_REFRESHING: { mIsAutoRefreshing = false; mRefreshHeaderContainer.getLayoutParams().height = 0; mRefreshHeaderContainer.requestLayout(); setStatus(STATUS_DEFAULT); mRefreshTrigger.onReset(); } break; } if (DEBUG) { LogUtils.logi(TAG, "onAnimationEnd " + getStatusLog(lastStatus) + " -> " + getStatusLog(mStatus) + " ;refresh view height:" + mRefreshHeaderContainer.getMeasuredHeight()); } } }; private void onFingerUpStartAnimating() { if (mStatus == STATUS_RELEASE_TO_REFRESH) { startScrollReleaseStatusToRefreshingStatus(); } else if (mStatus == STATUS_SWIPING_TO_REFRESH) { startScrollSwipingToRefreshStatusToDefaultStatus(); } } private void onPointerUp(MotionEvent e) { final int actionIndex = android.support.v4.view.MotionEventCompat.getActionIndex(e); if (android.support.v4.view.MotionEventCompat.getPointerId(e, actionIndex) == mActivePointerId) { // Pick a new pointer to pick up the slack. final int newIndex = actionIndex == 0 ? 1 : 0; mActivePointerId = android.support.v4.view.MotionEventCompat.getPointerId(e, newIndex); mLastTouchX = getMotionEventX(e, newIndex); mLastTouchY = getMotionEventY(e, newIndex); } } RefreshTrigger mRefreshTrigger = new RefreshTrigger() { @Override public void onStart(boolean automatic, int headerHeight, int finalHeight) { if (mRefreshHeaderView != null && mRefreshHeaderView instanceof RefreshTrigger) { RefreshTrigger trigger = (RefreshTrigger) mRefreshHeaderView; trigger.onStart(automatic, headerHeight, finalHeight); } } @Override public void onMove(boolean finished, boolean automatic, int moved) { if (mRefreshHeaderView != null && mRefreshHeaderView instanceof RefreshTrigger) { RefreshTrigger trigger = (RefreshTrigger) mRefreshHeaderView; trigger.onMove(finished, automatic, moved); } } @Override public void onRefresh() { if (mRefreshHeaderView != null && mRefreshHeaderView instanceof RefreshTrigger) { RefreshTrigger trigger = (RefreshTrigger) mRefreshHeaderView; trigger.onRefresh(); } } @Override public void onRelease() { if (mRefreshHeaderView != null && mRefreshHeaderView instanceof RefreshTrigger) { RefreshTrigger trigger = (RefreshTrigger) mRefreshHeaderView; trigger.onRelease(); } } @Override public void onComplete() { if (mRefreshHeaderView != null && mRefreshHeaderView instanceof RefreshTrigger) { RefreshTrigger trigger = (RefreshTrigger) mRefreshHeaderView; trigger.onComplete(); } } @Override public void onReset() { if (mRefreshHeaderView != null && mRefreshHeaderView instanceof RefreshTrigger) { RefreshTrigger trigger = (RefreshTrigger) mRefreshHeaderView; trigger.onReset(); } } }; private void setStatus(int status) { this.mStatus = status; if (DEBUG) { printStatusLog(); } } private void printStatusLog() { LogUtils.logi(TAG, getStatusLog(mStatus)); } private String getStatusLog(int status) { final String statusLog; switch (status) { case STATUS_DEFAULT: statusLog = "status_default"; break; case STATUS_SWIPING_TO_REFRESH: statusLog = "status_swiping_to_refresh"; break; case STATUS_RELEASE_TO_REFRESH: statusLog = "status_release_to_refresh"; break; case STATUS_REFRESHING: statusLog = "status_refreshing"; break; default: statusLog = "status_illegal!"; break; } return statusLog; } /** * 设置上拉加载更多状态 * * @param status */ public void setLoadMoreStatus(LoadMoreFooterView.Status status) { if (mLoadMoreFooterView != null && mLoadMoreFooterView instanceof LoadMoreFooterView) { ((LoadMoreFooterView) mLoadMoreFooterView).setStatus(status); } } /** * 获取上拉加载更多状态 * * @return */ public boolean canLoadMore() { if (mLoadMoreFooterView != null && mLoadMoreFooterView instanceof LoadMoreFooterView) { return ((LoadMoreFooterView) mLoadMoreFooterView).canLoadMore(); } else { return false; } } }