上拉
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import com.inroad.refresh.R;
import com.inroad.refresh.api.RefreshFooter;
import com.inroad.refresh.api.RefreshLayout;
import com.inroad.refresh.classics.ArrowDrawable;
import com.inroad.refresh.classics.ClassicsAbstract;
import com.inroad.refresh.constant.RefreshState;
import com.inroad.refresh.constant.SpinnerStyle;
import com.inroad.refresh.drawable.ProgressDrawable;
import com.inroad.refresh.util.SmartUtil;
@SuppressWarnings({"unused", "UnusedReturnValue"})
public class ClassicsFooter extends ClassicsAbstract<ClassicsFooter> implements RefreshFooter {
public static String REFRESH_FOOTER_PULLING = null;//"上拉加载更多";
public static String REFRESH_FOOTER_RELEASE = null;//"释放立即加载";
public static String REFRESH_FOOTER_LOADING = null;//"正在加载...";
public static String REFRESH_FOOTER_REFRESHING = null;//"正在刷新...";
public static String REFRESH_FOOTER_FINISH = null;//"加载完成";
public static String REFRESH_FOOTER_FAILED = null;//"加载失败";
public static String REFRESH_FOOTER_NOTHING = null;//"没有更多数据了";
protected String mTextPulling;//"上拉加载更多";
protected String mTextRelease;//"释放立即加载";
protected String mTextLoading;//"正在加载...";
protected String mTextRefreshing;//"正在刷新...";
protected String mTextFinish;//"加载完成";
protected String mTextFailed;//"加载失败";
protected String mTextNothing;//"没有更多数据了";
protected boolean mNoMoreData = false;
//<editor-fold desc="LinearLayout">
public ClassicsFooter(Context context) {
this(context, null);
}
public ClassicsFooter(Context context, AttributeSet attrs) {
super(context, attrs, 0);
View.inflate(context, R.layout.srl_classics_footer, this);
final View thisView = this;
final View arrowView = mArrowView = thisView.findViewById(R.id.srl_classics_arrow);
final View progressView = mProgressView = thisView.findViewById(R.id.srl_classics_progress);
mTitleText = thisView.findViewById(R.id.srl_classics_title);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ClassicsFooter);
LinearLayout.LayoutParams lpArrow = (LinearLayout.LayoutParams) arrowView.getLayoutParams();
LinearLayout.LayoutParams lpProgress = (LinearLayout.LayoutParams) progressView.getLayoutParams();
lpProgress.rightMargin = ta.getDimensionPixelSize(R.styleable.ClassicsFooter_srlDrawableMarginRight, SmartUtil.dp2px(10));
lpArrow.rightMargin = lpProgress.rightMargin;
lpArrow.width = ta.getLayoutDimension(R.styleable.ClassicsFooter_srlDrawableArrowSize, lpArrow.width);
lpArrow.height = ta.getLayoutDimension(R.styleable.ClassicsFooter_srlDrawableArrowSize, lpArrow.height);
lpProgress.width = ta.getLayoutDimension(R.styleable.ClassicsFooter_srlDrawableProgressSize, lpProgress.width);
lpProgress.height = ta.getLayoutDimension(R.styleable.ClassicsFooter_srlDrawableProgressSize, lpProgress.height);
lpArrow.width = ta.getLayoutDimension(R.styleable.ClassicsFooter_srlDrawableSize, lpArrow.width);
lpArrow.height = ta.getLayoutDimension(R.styleable.ClassicsFooter_srlDrawableSize, lpArrow.height);
lpProgress.width = ta.getLayoutDimension(R.styleable.ClassicsFooter_srlDrawableSize, lpProgress.width);
lpProgress.height = ta.getLayoutDimension(R.styleable.ClassicsFooter_srlDrawableSize, lpProgress.height);
mFinishDuration = ta.getInt(R.styleable.ClassicsFooter_srlFinishDuration, mFinishDuration);
mSpinnerStyle = SpinnerStyle.values[ta.getInt(R.styleable.ClassicsFooter_srlClassicsSpinnerStyle, mSpinnerStyle.ordinal)];
if (ta.hasValue(R.styleable.ClassicsFooter_srlDrawableArrow)) {
mArrowView.setImageDrawable(ta.getDrawable(R.styleable.ClassicsFooter_srlDrawableArrow));
} else if (mArrowView.getDrawable() == null) {
mArrowDrawable = new ArrowDrawable();
mArrowDrawable.setColor(0xff666666);
mArrowView.setImageDrawable(mArrowDrawable);
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlDrawableProgress)) {
mProgressView.setImageDrawable(ta.getDrawable(R.styleable.ClassicsFooter_srlDrawableProgress));
} else if (mProgressView.getDrawable() == null) {
mProgressDrawable = new ProgressDrawable();
mProgressDrawable.setColor(0xff666666);
mProgressView.setImageDrawable(mProgressDrawable);
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlTextSizeTitle)) {
mTitleText.setTextSize(TypedValue.COMPLEX_UNIT_PX, ta.getDimensionPixelSize(R.styleable.ClassicsFooter_srlTextSizeTitle, SmartUtil.dp2px(16)));
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlPrimaryColor)) {
super.setPrimaryColor(ta.getColor(R.styleable.ClassicsFooter_srlPrimaryColor, 0));
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlAccentColor)) {
super.setAccentColor(ta.getColor(R.styleable.ClassicsFooter_srlAccentColor, 0));
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlTextPulling)) {
mTextPulling = ta.getString(R.styleable.ClassicsFooter_srlTextPulling);
} else if (REFRESH_FOOTER_PULLING != null) {
mTextPulling = REFRESH_FOOTER_PULLING;
} else {
mTextPulling = context.getString(R.string.srl_footer_pulling);
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlTextRelease)) {
mTextRelease = ta.getString(R.styleable.ClassicsFooter_srlTextRelease);
} else if (REFRESH_FOOTER_RELEASE != null) {
mTextRelease = REFRESH_FOOTER_RELEASE;
} else {
mTextRelease = context.getString(R.string.srl_footer_release);
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlTextLoading)) {
mTextLoading = ta.getString(R.styleable.ClassicsFooter_srlTextLoading);
} else if (REFRESH_FOOTER_LOADING != null) {
mTextLoading = REFRESH_FOOTER_LOADING;
} else {
mTextLoading = context.getString(R.string.srl_footer_loading);
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlTextRefreshing)) {
mTextRefreshing = ta.getString(R.styleable.ClassicsFooter_srlTextRefreshing);
} else if (REFRESH_FOOTER_REFRESHING != null) {
mTextRefreshing = REFRESH_FOOTER_REFRESHING;
} else {
// mTextRefreshing = context.getString(R.string.srl_footer_refreshing);
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlTextFinish)) {
mTextFinish = ta.getString(R.styleable.ClassicsFooter_srlTextFinish);
} else if (REFRESH_FOOTER_FINISH != null) {
mTextFinish = REFRESH_FOOTER_FINISH;
} else {
mTextFinish = context.getString(R.string.srl_footer_finish);
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlTextFailed)) {
mTextFailed = ta.getString(R.styleable.ClassicsFooter_srlTextFailed);
} else if (REFRESH_FOOTER_FAILED != null) {
mTextFailed = REFRESH_FOOTER_FAILED;
} else {
mTextFailed = context.getString(R.string.srl_footer_failed);
}
if (ta.hasValue(R.styleable.ClassicsFooter_srlTextNothing)) {
mTextNothing = ta.getString(R.styleable.ClassicsFooter_srlTextNothing);
} else if (REFRESH_FOOTER_NOTHING != null) {
mTextNothing = REFRESH_FOOTER_NOTHING;
} else {
mTextNothing = context.getString(R.string.srl_footer_nothing);
}
ta.recycle();
progressView.animate().setInterpolator(null);
mTitleText.setText(thisView.isInEditMode() ? mTextLoading : mTextPulling);
if (thisView.isInEditMode()) {
arrowView.setVisibility(GONE);
} else {
progressView.setVisibility(GONE);
}
}
@Override
public int onFinish(@NonNull RefreshLayout layout, boolean success) {
super.onFinish(layout, success);
if (!mNoMoreData) {
mTitleText.setText(success ? mTextFinish : mTextFailed);
return mFinishDuration;
}
return 0;
}
/**
* ClassicsFooter 在(SpinnerStyle.FixedBehind)时才有主题色
*/
@Override
@Deprecated
public void setPrimaryColors(@ColorInt int... colors) {
if (mSpinnerStyle == SpinnerStyle.FixedBehind) {
super.setPrimaryColors(colors);
}
}
/**
* 设置数据全部加载完成,将不能再次触发加载功能
*/
@Override
public boolean setNoMoreData(boolean noMoreData) {
if (mNoMoreData != noMoreData) {
mNoMoreData = noMoreData;
final View arrowView = mArrowView;
if (noMoreData) {
mTitleText.setText(mTextNothing);
arrowView.setVisibility(GONE);
} else {
mTitleText.setText(mTextPulling);
arrowView.setVisibility(VISIBLE);
}
}
return true;
}
@Override
public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) {
final View arrowView = mArrowView;
if (!mNoMoreData) {
switch (newState) {
case None:
arrowView.setVisibility(VISIBLE);
case PullUpToLoad:
mTitleText.setText(mTextPulling);
arrowView.animate().rotation(180);
break;
case Loading:
case LoadReleased:
arrowView.setVisibility(GONE);
mTitleText.setText(mTextLoading);
break;
case ReleaseToLoad:
mTitleText.setText(mTextRelease);
arrowView.animate().rotation(0);
break;
case Refreshing:
mTitleText.setText(mTextRefreshing);
arrowView.setVisibility(GONE);
break;
default:
break;
}
}
}
}
下拉
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import com.inroad.refresh.R;
import com.inroad.refresh.api.RefreshHeader;
import com.inroad.refresh.api.RefreshLayout;
import com.inroad.refresh.classics.ArrowDrawable;
import com.inroad.refresh.classics.ClassicsAbstract;
import com.inroad.refresh.constant.RefreshState;
import com.inroad.refresh.constant.SpinnerStyle;
import com.inroad.refresh.drawable.ProgressDrawable;
import com.inroad.refresh.util.SmartUtil;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
@SuppressWarnings({"unused", "UnusedReturnValue"})
public class ClassicsHeader extends ClassicsAbstract<ClassicsHeader> implements RefreshHeader {
public static String REFRESH_HEADER_PULLING = null;//"下拉可以刷新";
public static String REFRESH_HEADER_REFRESHING = null;//"正在刷新...";
public static String REFRESH_HEADER_LOADING = null;//"正在加载...";
public static String REFRESH_HEADER_RELEASE = null;//"释放立即刷新";
public static String REFRESH_HEADER_FINISH = null;//"刷新完成";
public static String REFRESH_HEADER_FAILED = null;//"刷新失败";
public static String REFRESH_HEADER_UPDATE = null;//"上次更新 M-d HH:mm";
public static String REFRESH_HEADER_SECONDARY = null;//"释放进入二楼";
protected String KEY_LAST_UPDATE_TIME = "LAST_UPDATE_TIME";
protected SharedPreferences mShared;
protected DateFormat mLastUpdateFormat;
protected boolean mEnableLastTime = true;
protected String mTextPulling;//"下拉可以刷新";
protected String mTextRefreshing;//"正在刷新...";
protected String mTextLoading;//"正在加载...";
protected String mTextRelease;//"释放立即刷新";
protected String mTextFinish;//"刷新完成";
protected String mTextFailed;//"刷新失败";
protected String mTextUpdate;//"上次更新 M-d HH:mm";
protected String mTextSecondary;//"释放进入二楼";
public ClassicsHeader(Context context) {
this(context, null);
}
public ClassicsHeader(Context context, AttributeSet attrs) {
super(context, attrs, 0);
View.inflate(context, R.layout.srl_classics_header, this);
final View thisView = this;
final View arrowView = mArrowView = thisView.findViewById(R.id.srl_classics_arrow);
final View progressView = mProgressView = thisView.findViewById(R.id.srl_classics_progress);
mTitleText = thisView.findViewById(R.id.srl_classics_title);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ClassicsHeader);
LinearLayout.LayoutParams lpArrow = (LinearLayout.LayoutParams) arrowView.getLayoutParams();
LinearLayout.LayoutParams lpProgress = (LinearLayout.LayoutParams) progressView.getLayoutParams();
LinearLayout.LayoutParams lpUpdateText = new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
lpUpdateText.topMargin = ta.getDimensionPixelSize(R.styleable.ClassicsHeader_srlTextTimeMarginTop, SmartUtil.dp2px(0));
lpProgress.rightMargin = ta.getDimensionPixelSize(R.styleable.ClassicsHeader_srlDrawableMarginRight, SmartUtil.dp2px(10));
lpArrow.rightMargin = lpProgress.rightMargin;
lpArrow.width = ta.getLayoutDimension(R.styleable.ClassicsHeader_srlDrawableArrowSize, lpArrow.width);
lpArrow.height = ta.getLayoutDimension(R.styleable.ClassicsHeader_srlDrawableArrowSize, lpArrow.height);
lpProgress.width = ta.getLayoutDimension(R.styleable.ClassicsHeader_srlDrawableProgressSize, lpProgress.width);
lpProgress.height = ta.getLayoutDimension(R.styleable.ClassicsHeader_srlDrawableProgressSize, lpProgress.height);
lpArrow.width = ta.getLayoutDimension(R.styleable.ClassicsHeader_srlDrawableSize, lpArrow.width);
lpArrow.height = ta.getLayoutDimension(R.styleable.ClassicsHeader_srlDrawableSize, lpArrow.height);
lpProgress.width = ta.getLayoutDimension(R.styleable.ClassicsHeader_srlDrawableSize, lpProgress.width);
lpProgress.height = ta.getLayoutDimension(R.styleable.ClassicsHeader_srlDrawableSize, lpProgress.height);
mFinishDuration = ta.getInt(R.styleable.ClassicsHeader_srlFinishDuration, mFinishDuration);
mEnableLastTime = ta.getBoolean(R.styleable.ClassicsHeader_srlEnableLastTime, mEnableLastTime);
mSpinnerStyle = SpinnerStyle.values[ta.getInt(R.styleable.ClassicsHeader_srlClassicsSpinnerStyle, mSpinnerStyle.ordinal)];
if (ta.hasValue(R.styleable.ClassicsHeader_srlDrawableArrow)) {
mArrowView.setImageDrawable(ta.getDrawable(R.styleable.ClassicsHeader_srlDrawableArrow));
} else if (mArrowView.getDrawable() == null) {
mArrowDrawable = new ArrowDrawable();
mArrowDrawable.setColor(0xff666666);
mArrowView.setImageDrawable(mArrowDrawable);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlDrawableProgress)) {
mProgressView.setImageDrawable(ta.getDrawable(R.styleable.ClassicsHeader_srlDrawableProgress));
} else if (mProgressView.getDrawable() == null) {
mProgressDrawable = new ProgressDrawable();
mProgressDrawable.setColor(0xff666666);
mProgressView.setImageDrawable(mProgressDrawable);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextSizeTitle)) {
mTitleText.setTextSize(TypedValue.COMPLEX_UNIT_PX, ta.getDimensionPixelSize(R.styleable.ClassicsHeader_srlTextSizeTitle, SmartUtil.dp2px(16)));
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlPrimaryColor)) {
super.setPrimaryColor(ta.getColor(R.styleable.ClassicsHeader_srlPrimaryColor, 0));
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlAccentColor)) {
setAccentColor(ta.getColor(R.styleable.ClassicsHeader_srlAccentColor, 0));
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextPulling)) {
mTextPulling = ta.getString(R.styleable.ClassicsHeader_srlTextPulling);
} else if (REFRESH_HEADER_PULLING != null) {
mTextPulling = REFRESH_HEADER_PULLING;
} else {
mTextPulling = context.getString(R.string.srl_header_pulling);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextLoading)) {
mTextLoading = ta.getString(R.styleable.ClassicsHeader_srlTextLoading);
} else if (REFRESH_HEADER_LOADING != null) {
mTextLoading = REFRESH_HEADER_LOADING;
} else {
// mTextLoading = context.getString(R.string.srl_header_loading);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextRelease)) {
mTextRelease = ta.getString(R.styleable.ClassicsHeader_srlTextRelease);
} else if (REFRESH_HEADER_RELEASE != null) {
mTextRelease = REFRESH_HEADER_RELEASE;
} else {
mTextRelease = context.getString(R.string.srl_header_release);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextFinish)) {
mTextFinish = ta.getString(R.styleable.ClassicsHeader_srlTextFinish);
} else if (REFRESH_HEADER_FINISH != null) {
mTextFinish = REFRESH_HEADER_FINISH;
} else {
mTextFinish = context.getString(R.string.srl_header_finish);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextFailed)) {
mTextFailed = ta.getString(R.styleable.ClassicsHeader_srlTextFailed);
} else if (REFRESH_HEADER_FAILED != null) {
mTextFailed = REFRESH_HEADER_FAILED;
} else {
mTextFailed = context.getString(R.string.srl_header_failed);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextSecondary)) {
mTextSecondary = ta.getString(R.styleable.ClassicsHeader_srlTextSecondary);
} else if (REFRESH_HEADER_SECONDARY != null) {
mTextSecondary = REFRESH_HEADER_SECONDARY;
} else {
mTextSecondary = context.getString(R.string.srl_header_secondary);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextRefreshing)) {
mTextRefreshing = ta.getString(R.styleable.ClassicsHeader_srlTextRefreshing);
} else if (REFRESH_HEADER_REFRESHING != null) {
mTextRefreshing = REFRESH_HEADER_REFRESHING;
} else {
mTextRefreshing = context.getString(R.string.srl_header_refreshing);
}
if (ta.hasValue(R.styleable.ClassicsHeader_srlTextUpdate)) {
mTextUpdate = ta.getString(R.styleable.ClassicsHeader_srlTextUpdate);
} else if (REFRESH_HEADER_UPDATE != null) {
mTextUpdate = REFRESH_HEADER_UPDATE;
} else {
mTextUpdate = context.getString(R.string.srl_header_update);
}
mLastUpdateFormat = new SimpleDateFormat(mTextUpdate, Locale.getDefault());
ta.recycle();
progressView.animate().setInterpolator(null);
mTitleText.setText(thisView.isInEditMode() ? mTextRefreshing : mTextPulling);
if (thisView.isInEditMode()) {
arrowView.setVisibility(GONE);
} else {
progressView.setVisibility(GONE);
}
try {//try 不能删除-否则会出现兼容性问题
if (context instanceof FragmentActivity) {
FragmentManager manager = ((FragmentActivity) context).getSupportFragmentManager();
if (manager != null) {
@SuppressLint("RestrictedApi")
List<Fragment> fragments = manager.getFragments();
if (fragments.size() > 0) {
return;
}
}
}
} catch (Throwable e) {
e.printStackTrace();
}
KEY_LAST_UPDATE_TIME += context.getClass().getName();
mShared = context.getSharedPreferences("ClassicsHeader", Context.MODE_PRIVATE);
}
@Override
public int onFinish(@NonNull RefreshLayout layout, boolean success) {
if (success) {
mTitleText.setText(mTextFinish);
} else {
mTitleText.setText(mTextFailed);
}
return super.onFinish(layout, success);
}
@Override
public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) {
final View arrowView = mArrowView;
switch (newState) {
case None:
case PullDownToRefresh:
mTitleText.setText(mTextPulling);
arrowView.setVisibility(VISIBLE);
arrowView.animate().rotation(0);
break;
case Refreshing:
case RefreshReleased:
mTitleText.setText(mTextRefreshing);
arrowView.setVisibility(GONE);
break;
case ReleaseToRefresh:
mTitleText.setText(mTextRelease);
arrowView.animate().rotation(180);
break;
case ReleaseToTwoLevel:
mTitleText.setText(mTextSecondary);
arrowView.animate().rotation(0);
break;
case Loading:
arrowView.setVisibility(GONE);
mTitleText.setText(mTextLoading);
break;
default:
break;
}
}
@Override
public ClassicsHeader setAccentColor(@ColorInt int accentColor) {
return super.setAccentColor(accentColor);
}
}