package cn.coderss.pulltorefresh; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; /** * 这个类定义了Header和Footer的共通行为 * * @author Li Hong * @since 2013-8-16 */ public abstract class LoadingLayout extends FrameLayout implements ILoadingLayout { /**容器布局*/ private View mContainer; /**当前的状态*/ private State mCurState = State.NONE; /**前一个状态*/ private State mPreState = State.NONE; /** * 构造方法 * * @param context context */ public LoadingLayout(Context context) { this(context, null); } /** * 构造方法 * * @param context context * @param attrs attrs */ public LoadingLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } /** * 构造方法 * * @param context context * @param attrs attrs * @param defStyle defStyle */ public LoadingLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } /** * 初始化 * * @param context context * @param attrs attrs */ protected void init(Context context, AttributeSet attrs) { mContainer = createLoadingView(context, attrs); if (null == mContainer) { throw new NullPointerException("Loading view can not be null."); } FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); addView(mContainer, params); } /** * 显示或隐藏这个布局 * * @param show flag */ public void show(boolean show) { // If is showing, do nothing. if (show == (View.VISIBLE == getVisibility())) { return; } ViewGroup.LayoutParams params = mContainer.getLayoutParams(); if (null != params) { if (show) { params.height = ViewGroup.LayoutParams.WRAP_CONTENT; } else { params.height = 0; } setVisibility(show ? View.VISIBLE : View.INVISIBLE); } } /** * 设置最后更新的时间文本 * * @param label 文本 */ public void setLastUpdatedLabel(CharSequence label) { } /** * 设置加载中的图片 * * @param drawable 图片 */ public void setLoadingDrawable(Drawable drawable) { } /** * 设置拉动的文本,典型的是“下拉可以刷新” * * @param pullLabel 拉动的文本 */ public void setPullLabel(CharSequence pullLabel) { } /** * 设置正在刷新的文本,典型的是“正在刷新” * * @param refreshingLabel 刷新文本 */ public void setRefreshingLabel(CharSequence refreshingLabel) { } /** * 设置释放的文本,典型的是“松开可以刷新” * * @param releaseLabel 释放文本 */ public void setReleaseLabel(CharSequence releaseLabel) { } @Override public void setState(State state) { if (mCurState != state) { mPreState = mCurState; mCurState = state; onStateChanged(state, mPreState); } } @Override public State getState() { return mCurState; } @Override public void onPull(float scale) { } /** * 得到前一个状态 * * @return 状态 */ protected State getPreState() { return mPreState; } /** * 当状态改变时调用 * * @param curState 当前状态 * @param oldState 老的状态 */ protected void onStateChanged(State curState, State oldState) { switch (curState) { case RESET: onReset(); break; case RELEASE_TO_REFRESH: onReleaseToRefresh(); break; case PULL_TO_REFRESH: onPullToRefresh(); break; case REFRESHING: onRefreshing(); break; case NO_MORE_DATA: onNoMoreData(); break; default: break; } } /** * 当状态设置为{@link State#RESET}时调用 */ protected void onReset() { } /** * 当状态设置为{@link State#PULL_TO_REFRESH}时调用 */ protected void onPullToRefresh() { } /** * 当状态设置为{@link State#RELEASE_TO_REFRESH}时调用 */ protected void onReleaseToRefresh() { } /** * 当状态设置为{@link State#REFRESHING}时调用 */ protected void onRefreshing() { } /** * 当状态设置为{@link State#NO_MORE_DATA}时调用 */ protected void onNoMoreData() { } /** * 得到当前Layout的内容大小,它将作为一个刷新的临界点 * * @return 高度 */ public abstract int getContentSize(); /** * 创建Loading的View * * @param context context * @param attrs attrs * @return Loading的View */ protected abstract View createLoadingView(Context context, AttributeSet attrs); }