下拉刷新

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());    }}

更多相关文章

  1. android java获取当前时间的总结
  2. Android 图片加载缓存
  3. 网络时间同步
  4. android 状态栏移动到底部
  5. 关于标准android中视频播放器中的快进和快退的步长时间设置
  6. 修改应用按键无响应的时间
  7. Android 如何加载大图片
  8. Android 图片加载库Glide
  9. Android 如何调用MediaPlayer播放视频[状态机]【图】

随机推荐

  1. 急!html中用图片做背景死活显示不了啊!网上
  2. 9.1.4 前端 - HTML body标签 - 标题,段落
  3. 如何通过多次单击在画布上显示多个箭头
  4. 关于 客户端发现响应内容类型为“text/ht
  5. 【麦子学院】03.web前端开发之html5本地
  6. HTML的CHECKBOX后面的文字点击同时选中
  7. 限制HTML输入,只允许粘贴
  8. 调整另一个div的div onclick,过渡效果
  9. 如何在HTML主体上设置网格ExtJS,高度为100
  10. 2003生成 注释web页问题,第二级的html 内