自定义ListView的下拉刷新控件

来源:互联网 发布:您的网络存在安全风险 编辑:程序博客网 时间:2024/05/20 20:21
package com.example.lxy.refreshlistview;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.RotateAnimation;import android.widget.AbsListView;import android.widget.ImageView;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;import java.text.SimpleDateFormat;import java.util.Date;/** * Created by 栾绪业 on 2016/07/24. */public class RefreshListView extends ListView implements AbsListView.OnScrollListener {    View header;//顶部的布局文件    int headerHeight;    int firstVisibleItem;    boolean isRemark; //标记当前是在listview最顶端按下的    int startY;    int state;//当前的状态    final int NONE = 0;//正常状态    final int PULL = 1;//提示下拉状态    final int RELESE = 2;//提示释放状态    final int REFLASHING = 3;//刷新状态    int scrollState; //listview的当前滚动状态    IRelashListner iRelashListner ; //刷新数据的接口    public RefreshListView(Context context) {        super(context);        initView(context);    }    public RefreshListView(Context context, AttributeSet attrs) {        super(context, attrs);        initView(context);    }    public RefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView(context);    }    /**     * 初始化界面,添加顶部布局文件到listview     *     * @param context     */    private void initView(Context context) {        LayoutInflater inflater = LayoutInflater.from(context);        header = inflater.inflate(R.layout.header_layout, null);        measureView(header);        headerHeight = header.getMeasuredHeight();        topPadding(-headerHeight);        this.addHeaderView(header);        this.setOnScrollListener(this);    }    /**     * 通知父布局,占用的宽,高     *     * @param view     */    private void measureView(View view) {        ViewGroup.LayoutParams p = view.getLayoutParams();        if (p == null) {            p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);        }        int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);        int height;        int tempHeight = p.height;        if (tempHeight > 0) {            height = MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY);        } else {            height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);        }        view.measure(width, height);    }    /**     * 设置header布局的上边距     *     * @param topPadding     */    private void topPadding(int topPadding) {        header.setPadding(header.getPaddingLeft(), topPadding, header.getPaddingRight(), header.getPaddingBottom());        header.invalidate();    }    /**     * 该方法为移动的距离     *     * @param ev     */    private void onMove(MotionEvent ev) {        if (!isRemark) {            return;        }        int tempY = (int) ev.getY();        int space = tempY - startY;        int topPadding = space - headerHeight;        switch (state) {            case NONE:                if (space > 0) {                    state = PULL;                    reflashViewByState();                }                break;            case PULL:                topPadding(topPadding);                if (space > headerHeight + 30 && scrollState == SCROLL_STATE_TOUCH_SCROLL) {                    state = RELESE;                    reflashViewByState();                }                break;            case RELESE:                topPadding(topPadding);                if (space < headerHeight + 30) {                    state = PULL;                    reflashViewByState();                } else if (space <= 0) {                    state = NONE;                    isRemark = false;                    reflashViewByState();                }                break;        }    }    //一下的方法是监听listview的滑动事件的处理    @Override    public void onScrollStateChanged(AbsListView view, int scrollState) {        this.scrollState = scrollState;    }    @Override    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {        this.firstVisibleItem = firstVisibleItem;    }    /**     * 监听点击的事件     * @param ev     * @return     */    @Override    public boolean onTouchEvent(MotionEvent ev) {        switch (ev.getAction()) {            case MotionEvent.ACTION_DOWN:                if (firstVisibleItem == 0) {                    isRemark = true;                    startY = (int) ev.getY();                    reflashViewByState();                }                break;            case MotionEvent.ACTION_MOVE:                onMove(ev);                break;            case MotionEvent.ACTION_UP:                if (state == RELESE) {                    state = REFLASHING;                    //开始加载数据                    reflashViewByState();                    iRelashListner.onReflash();                } else if (state == PULL) {                    state = NONE;                    isRemark = false;                    reflashViewByState();                }                break;        }        return super.onTouchEvent(ev);    }    /**     * 根据当前状态,改变界面显示     */    private void reflashViewByState() {        TextView tip = (TextView) header.findViewById(R.id.tip);        ImageView arrow = (ImageView) header.findViewById(R.id.arrow);        ProgressBar progress = (ProgressBar) header.findViewById(R.id.progress);        RotateAnimation anim = new RotateAnimation(0, 180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);        anim.setDuration(500);        anim.setFillAfter(true);        RotateAnimation anim1 = new RotateAnimation(0, 180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);        anim1.setDuration(500);        anim1.setFillAfter(true);        switch (state) {            case NONE:                topPadding(-headerHeight);                arrow.clearAnimation();                break;            case PULL:                arrow.setVisibility(View.VISIBLE);                progress.setVisibility(View.INVISIBLE);                tip.setText("下拉可以刷新");                arrow.setAnimation(anim1);                break;            case RELESE:                arrow.setVisibility(View.VISIBLE);                progress.setVisibility(View.INVISIBLE);                tip.setText("松开可以刷新");                arrow.setAnimation(anim);                break;            case REFLASHING:                topPadding(50);                arrow.setVisibility(View.INVISIBLE);                progress.setVisibility(View.VISIBLE);                tip.setText("正在刷新");                arrow.clearAnimation();                break;        }    }    /**     * 获取完数据     */    public void reflashComplete(){        state = NONE ;        isRemark = false ;        reflashViewByState();        TextView lastupdatetime = (TextView) header.findViewById(R.id.lastupdate);        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss") ;        Date date = new Date(System.currentTimeMillis()) ;        String string = format.format(date) ;        lastupdatetime.setText(string);    }    /**     * 接口回掉     * @param iRelashListner     */    public void setInterface(IRelashListner iRelashListner){        this.iRelashListner = iRelashListner ;    }    /**     * 刷新数据     */    public interface IRelashListner{        public void onReflash() ;    }}
0 0