*/
public static final long ONE_DAY = 24 * ONE_HOUR;
/**
- 一月的毫秒值,用于判断上次的更新时间
*/
public static final long ONE_MONTH = 30 * ONE_DAY;
/**
- 一年的毫秒值,用于判断上次的更新时间
*/
public static final long ONE_YEAR = 12 * ONE_MONTH;
/**
- 上次更新时间的字符串常量,用于作为SharedPreferences的键值
*/
private static final String UPDATED_AT = “updated_at”;
/**
- 下拉刷新的回调接口
*/
private PullToRefreshListener mListener;
/**
- 用于存储上次更新时间
*/
private SharedPreferences preferences;
/**
- 下拉头的View
*/
private View header;
/**
- 需要去下拉刷新的ListView
*/
private ListView listView;
/**
- 刷新时显示的进度条
*/
private ProgressBar progressBar;
/**
- 指示下拉和释放的箭头
*/
private ImageView arrow;
/**
- 指示下拉和释放的文字描述
*/
private TextView description;
/**
- 上次更新时间的文字描述
*/
private TextView updateAt;
/**
- 下拉头的布局参数
*/
private MarginLayoutParams headerLayoutParams;
/**
- 上次更新时间的毫秒值
*/
private long lastUpdateTime;
/**
- 为了防止不同界面的下拉刷新在上次更新时间上互相有冲突,使用id来做区分
*/
private int mId = -1;
/**
- 下拉头的高度
*/
private int hideHeaderHeight;
/**
- 当前处理什么状态,可选值有STATUS_PULL_TO_REFRESH, STATUS_RELEASE_TO_REFRESH,
- STATUS_REFRESHING 和 STATUS_REFRESH_FINISHED
*/
private int currentStatus = STATUS_REFRESH_FINISHED;;
/**
- 记录上一次的状态是什么,避免进行重复操作
*/
private int lastStatus = currentStatus;
/**
- 手指按下时的屏幕纵坐标
*/
private float yDown;
/**
- 在被判定为滚动之前用户手指可以移动的最大值。
*/
private int touchSlop;
/**
- 是否已加载过一次layout,这里onLayout中的初始化只需加载一次
*/
private boolean loadOnce;
/**
- 当前是否可以下拉,只有ListView滚动到头的时候才允许下拉
*/
private boolean ableToPull;
/**
- 下拉刷新控件的构造函数,会在运行时动态添加一个下拉头的布局。
- @param context
- @param attrs
*/
public RefreshableView(Context context, AttributeSet attrs) {
super(context, attrs);
preferences = PreferenceManager.getDefaultSharedPreferences(context);
header = LayoutInflater.from(context).inflate(R.layout.pull_to_refresh, null, true);
progressBar = (ProgressBar) header.findViewById(R.id.progress_bar);
arrow = (ImageView) header.findViewById(R.id.arrow);
description = (TextView) header.findViewById(R.id.description);
updateAt = (TextView) header.findViewById(R.id.updated_at);
touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
refreshUpdatedAtValue();
setOrientation(VERTICAL);
addView(header, 0);
}
/**
- 进行一些关键性的初始化操作,比如:将下拉头向上偏移进行隐藏,给ListView注册touch事件。
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (changed && !loadOnce) {
hideHeaderHeight = -header.getHeight();
headerLayoutParams = (MarginLayoutParams) header.getLayoutParams();
headerL