Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

文章详细描述了一个自定义的Android下拉刷新控件RefreshableView的实现,包括构造函数、布局管理、触摸事件处理、刷新逻辑以及监听器接口。它展示了如何动态添加下拉头、判断滚动状态和执行刷新任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*/
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值