自定义下拉刷新listview

package com.practice.syd.refreshlistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Administrator on 2017/10/20.
 */

public class RefreshListView extends ListView {

    private View footerView;
    private int footerViewHeight;
    private LinearLayout headerView;
    private View ll_pull_down_refresh;
    private ImageView iv_arrow;
    private ProgressBar pb_status;
    private TextView tv_status;
    private TextView tv_time;
    private int pullDownRefreshHeight,paddingTop;
    private float startY=-1,endY,distanceY;
    private RotateAnimation upAnimation;
    private RotateAnimation downAnimation;
    private LoadingListener loadingListener;
    /**
     * 下拉刷新
     */
    public static final int PULL_DOWN_REFRESH = 0;

    /**
     * 手松刷新
     */
    public static final int RELEASE_REFRESH = 1;


    /**
     * 正在刷新
     */
    public static final int REFRESHING = 2;


    /**
     * 当前状态
     */
    private int currentStatus = PULL_DOWN_REFRESH;
    private boolean isLoadMore;
    private View topNewsView;

    public RefreshListView(Context context) {
       this(context,null);
    }

    public RefreshListView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public RefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initHeaderView(context);
        initAnimation();
        initFooterView(context);
    }
    //处理下拉刷新
    private void initHeaderView(Context context) {
        headerView = (LinearLayout) View.inflate(context, R.layout.refresh_header, null);
        //下拉刷新控件
        ll_pull_down_refresh = headerView.findViewById(R.id.ll_pull_down_refresh);
        iv_arrow = (ImageView) headerView.findViewById(R.id.iv_arrow);
        pb_status = (ProgressBar) headerView.findViewById(R.id.pb_status);
        tv_status = (TextView) headerView.findViewById(R.id.tv_status);
        tv_time = (TextView) headerView.findViewById(R.id.tv_time);

        //测量
        ll_pull_down_refresh.measure(0, 0);
        pullDownRefreshHeight = ll_pull_down_refresh.getMeasuredHeight();

        //默认隐藏下拉刷新控件
        // View.setPadding(0,-控件高,0,0);//完全隐藏
        //View.setPadding(0, 0,0,0);//完全显示
        ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);

        //添加ListView的头
        addHeaderView(headerView);
    }
    private void initAnimation() {
        upAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        upAnimation.setDuration(500);
        upAnimation.setFillAfter(true);

        downAnimation = new RotateAnimation(-180, -360, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        downAnimation.setDuration(500);
        downAnimation.setFillAfter(true);
    }
    //判断是否触发下拉刷新事件
    private boolean isTopNewsDisplay() {
        if(topNewsView!=null){
            int[] location=new int[2];
            getLocationOnScreen(location);
            int listY = location[1];
            topNewsView.getLocationOnScreen(location);
            int topY=location[1];
            if(listY<=topY){
                return true;
            }
            else
                return false;
        }else
            return false;
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                startY=ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                if(startY==-1){
                    startY=ev.getY();
                }
                if(!isTopNewsDisplay()){
                    break;
                }
                //防止处于刷新状态时又重复触发刷新事件
                if(currentStatus==REFRESHING)
                    break;
                endY=ev.getY();
                distanceY=endY-startY;
                if(distanceY>0){
                    paddingTop=(int) (-pullDownRefreshHeight+distanceY);
                    //后半截的判断主要是防止动画重复播放
                    if (paddingTop < 0 && currentStatus != PULL_DOWN_REFRESH) {
                        //下拉刷新状态
                        currentStatus = PULL_DOWN_REFRESH;
                        //更新状态
                        refreshViewState();

                    } else if (paddingTop > 0 && currentStatus != RELEASE_REFRESH) {
                        //手松刷新状态
                        currentStatus = RELEASE_REFRESH;
                        //更新状态
                        refreshViewState();

                    }

                    ll_pull_down_refresh.setPadding(0, paddingTop, 0, 0);
                    //View.setPadding(0,paddingTop,0,0);//动态的显示下拉刷新控件
                }
                break;
            case MotionEvent.ACTION_UP:
                startY=-1;
                if (currentStatus == PULL_DOWN_REFRESH) {
//                    View.setPadding(0,-控件高,0,0);//完全隐藏
                    ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);
                } else if (currentStatus == RELEASE_REFRESH) {
                    //设置状态为正在刷新
                    currentStatus = REFRESHING;

                    refreshViewState();

//                    View.setPadding(0,0,0,0);//完全显示
                    ll_pull_down_refresh.setPadding(0, 0, 0, 0);
                    if(loadingListener!=null){
                        loadingListener.onRefresh();
                    }
                }
                break;
            default:
                break;
        }
        return super.onTouchEvent(ev);
    }

    private void refreshViewState() {

        switch (currentStatus) {
            case PULL_DOWN_REFRESH://下拉刷新状态
                iv_arrow.startAnimation(downAnimation);
                tv_status.setText("下拉刷新...");
                break;

            case RELEASE_REFRESH://手松刷新状态
                iv_arrow.startAnimation(upAnimation);
                tv_status.setText("手松刷新...");
                break;
            case REFRESHING://正在刷新状态
                tv_status.setText("正在刷新...");
                pb_status.setVisibility(VISIBLE);
                iv_arrow.clearAnimation();
                iv_arrow.setVisibility(GONE);
                break;
        }

    }
    //处理上拉加载
    private void initFooterView(Context context) {
        footerView = View.inflate(context, R.layout.refresh_footer, null);
        footerView.measure(0, 0);
        footerViewHeight = footerView.getMeasuredHeight();


        footerView.setPadding(0, -footerViewHeight, 0, 0);

        //ListView添加footer
        addFooterView(footerView);
        setOnScrollListener(new OnLoadMoreScrollListener());

    }
    private class OnLoadMoreScrollListener implements OnScrollListener {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if(scrollState==OnScrollListener.SCROLL_STATE_FLING||scrollState==OnScrollListener.SCROLL_STATE_IDLE){
                if(getLastVisiblePosition()>=getCount()-1){
                    footerView.setPadding(8,8,8,8);
                    isLoadMore=true;
                    if(loadingListener!=null){
                        loadingListener.onLodeMore();
                    }
                }
            }

        }

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

        }
    }


    public void refreshComplete(Boolean sucess) {
        if(isLoadMore){
            isLoadMore=false;
            footerView.setPadding(0,-footerViewHeight,0,0);
        }else {
//        //恢复下拉控件的初始状态
            tv_status.setText("下拉刷新...");
            currentStatus = PULL_DOWN_REFRESH;
            iv_arrow.clearAnimation();
            pb_status.setVisibility(GONE);
            iv_arrow.setVisibility(VISIBLE);
//        //隐藏下拉刷新控件
            ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);
            if (sucess) {
                //设置最新更新时间
                tv_time.setText("上次更新时间:" + getSystemTime());
            }
        }
    }
    private String getSystemTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(new Date());
    }

    public void addTopNewsView(View topNewsView) {
        if(topNewsView != null){
           this.topNewsView= topNewsView;
            headerView.addView(topNewsView);
        }
    }

    public interface LoadingListener{
        public void onRefresh();
        public void onLodeMore();
    }
    public void setLoadingListener(LoadingListener loadingListener){
        this.loadingListener=loadingListener;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值