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; } }
自定义下拉刷新listview
最新推荐文章于 2019-04-07 09:51:11 发布