android下拉刷新

下拉刷新

package com.lcj.demo1.view;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.lcj.demo1.R;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PullToRefreshListView extends ListView implements AbsListView.OnScrollListener {

    private View headerView;
    private View footerView;
    private ImageView iv;
    private ProgressBar pb;
    private int headerViewHeight;
    private TextView tv;
    private TextView tvTime;
    private OnRefreshListener mListener;

    int startY = -1;
    private static final int PULL_STATE = 0; // 下拉状态
    private static final int RELEASE_STATE = 1; // 松开状态
    private static final int REFRESHING_STATE = 2; // 刷新状态
    private int mCurrentState = PULL_STATE; // 当前状态
    private int footerViewHeight;

    public PullToRefreshListView(Context context) {
        super(context);
        initHeadView();
        initFootView();
    }

    public PullToRefreshListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initHeadView();
        initFootView();
    }

    public PullToRefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initHeadView();
        initFootView();
    }

    private void initHeadView() {
        headerView = View.inflate(getContext(), R.layout.header_listview, null);

        iv = (ImageView) headerView.findViewById(R.id.iv);
        pb = (ProgressBar) headerView.findViewById(R.id.pb);
        tv = (TextView) headerView.findViewById(R.id.tv_desc);
        tvTime = (TextView) headerView.findViewById(R.id.tv_time);

        addHeaderView(headerView);
        headerView.measure(0, 0);
        headerViewHeight = headerView.getMeasuredHeight();
        this.setPadding(0, -headerViewHeight, 0, 0);

        tvTime.setText("上次刷新时间:" + getCurrentTime());
    }

    private void initFootView() {
        footerView = View.inflate(getContext(), R.layout.footer_listview, null);
        addFooterView(footerView);
        footerView.measure(0, 0);
        footerViewHeight = footerView.getMeasuredHeight();
        footerView.setPadding(0, -footerViewHeight, 0, 0);
        this.setOnScrollListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startY = (int) ev.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                if (startY == -1) {
                    startY = (int) ev.getRawY();
                }
                if (mCurrentState == REFRESHING_STATE) {
                    break;
                }
                int endY = (int) ev.getRawY();
                int dy = endY - startY;
                if (dy > 0 && getFirstVisiblePosition() == 0) {
                    int diff = dy - headerViewHeight;
                    this.setPadding(0, diff, 0, 0);
                    if (diff > 0 && mCurrentState != RELEASE_STATE) {
                        mCurrentState = RELEASE_STATE;
                        refreshState();
                    } else if (diff <= 0 && mCurrentState != PULL_STATE) {
                        mCurrentState = PULL_STATE;
                        refreshState();
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                startY = -1;
                if (mCurrentState == PULL_STATE) {
                    this.setPadding(0, -headerViewHeight, 0, 0);
                } else if (mCurrentState == RELEASE_STATE) {
                    mCurrentState = REFRESHING_STATE;
                    refreshState();
                    this.setPadding(0, 0, 0, 0);
                }
                break;
            default:
                break;
        }
        return super.onTouchEvent(ev);
    }

    private void refreshState() {
        switch (mCurrentState) {
            case PULL_STATE:
                tv.setText("下拉刷新");
                iv.setVisibility(View.VISIBLE);
                pb.setVisibility(View.INVISIBLE);
                break;
            case RELEASE_STATE:
                tv.setText("松开刷新");
                iv.setVisibility(View.VISIBLE);
                pb.setVisibility(View.INVISIBLE);
                break;
            case REFRESHING_STATE:
                tv.setText("正在刷新");
                iv.setVisibility(View.INVISIBLE);
                pb.setVisibility(View.VISIBLE);
                if (mListener != null) {
                    mListener.onRefresh();
                }
                break;
            default:
                break;

        }
    }

    public void setOnRefreshListener(OnRefreshListener listener) {
        this.mListener = listener;
    }

    public interface OnRefreshListener {
        public void onRefresh(); // 下拉刷新

        public void onLoadMore(); // 加载更多
    }

    private boolean isLoadMore;

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

        if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_FLING) {
            if (getLastVisiblePosition() == getCount() - 1 && !isLoadMore) { // 到达了最后一条

                footerView.setPadding(0, 0, 0, 0);
                setSelection(getCount() - 1);
                Log.d(PullToRefreshListView.class.getName(), "onScrollStateChanged: " + getCount());
                isLoadMore = true;
                if (mListener != null) {
                    mListener.onLoadMore();
                }
            }
        }

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
                         int visibleItemCount, int totalItemCount) {

    }

    /**
     * 刷新完成
     */
    public void onRefreshCompleted() {
        if (isLoadMore) {
            footerView.setPadding(0, -footerViewHeight, 0, 0);
            isLoadMore = false;
        } else {
            mCurrentState = PULL_STATE;
            tv.setText("下拉刷新");
            iv.setVisibility(View.VISIBLE);
            pb.setVisibility(View.INVISIBLE);
            this.setPadding(0, -headerViewHeight, 0, 0);

            tvTime.setText("上次刷新时间:" + getCurrentTime());
        }
    }


    private String getCurrentTime() {
        SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
        return format.format(new Date());
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值