RefreshListView
package com.example.zhbj_heima47.view;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.example.zhbj_heima47.R;
public class RefreshListView extends ListView implements OnScrollListener{
private LinearLayout refresh_header_root;
private LinearLayout refresh_header_view;
private ProgressBar refresh_header_progressbar;
private ImageView refresh_header_imageview;
private TextView refresh_header_text;
private TextView refresh_header_time;
private int headerHeight;
private View customerView;
private RotateAnimation rotateAnimationUp;
private RotateAnimation rotateAnimationDown;
private int downY = -1;
private int mfirstVisibleItem = -1;
private int currentState = PULL_REFRESH;
//onRefreshListener传递进来的对象(刷新,加载)
private OnRefreshListener onRefreshListener;
//下拉刷新
private static final int PULL_REFRESH = 0;
//释放刷新
private static final int RELEASE_REFRESH = 1;
//正在刷新
private static final int IS_REFRESHING = 2;
// private Handler handler = new Handler(){
// public void handleMessage(android.os.Message msg) {
// finish();
// };
// };
private LinearLayout refresh_footer_root;
private int footerHeight;
//默认为没有加载更多
private boolean isload = false;
public RefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
//添加刷新头,放置在ListView最顶部
initHeader();
initFooter();
setOnScrollListener(this);
}
public RefreshListView(Context context) {
super(context);
initHeader();
initFooter();
setOnScrollListener(this);
}
private void initFooter() {
View viewFooter = View.inflate(getContext(), R.layout.refresh_footer, null);
refresh_footer_root = (LinearLayout) viewFooter.findViewById(R.id.refresh_footer_root);
refresh_footer_root.measure(0, 0);
footerHeight = refresh_footer_root.getMeasuredHeight();
refresh_footer_root.setPadding(0,-footerHeight, 0, 0);
this.addFooterView(viewFooter);
}
public interface OnRefreshListener{
//下拉刷新的方法
public void pullDownRefresh();
//上拉加载的方法
public void loadMore();
}
public void setOnRefreshListener(OnRefreshListener onRefreshListener){
this.onRefreshListener = onRefreshListener;
}
private void initHeader() {
View view = View.inflate(getContext(), R.layout.refresh_header, null);
refresh_header_root = (LinearLayout) view.findViewById(R.id.refresh_header_root);
//刷新头对应控件
refresh_header_view = (LinearLayout) view.findViewById(R.id.refresh_header_view);
refresh_header_progressbar = (ProgressBar) view.findViewById(R.id.refresh_header_progressbar);
refresh_header_imageview = (ImageView) view.findViewById(R.id.refresh_header_imageview);
refresh_header_text = (TextView) view.findViewById(R.id.refresh_header_text);
refresh_header_time = (TextView) view.findViewById(R.id.refresh_header_time);
refresh_header_view.measure(0, 0);
headerHeight = refresh_header_view.getMeasuredHeight();
refresh_header_view.setPadding(0, -headerHeight, 0, 0);
this.addHeaderView(view);
//初始化箭头的选择动画
initAnimation();
}
private void initAnimation() {
//逆时针选择180度 箭头由下向上旋转
rotateAnimationUp = new RotateAnimation(
0, -180,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimationUp.setDuration(500);
rotateAnimationUp.setFillAfter(true);
//逆时针选择180度 箭头由上向下选择
rotateAnimationDown = new RotateAnimation(
-180,-360 ,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimationDown.setDuration(500);
rotateAnimationDown.setFillAfter(true);
}
/**
* 刷新或加载完毕后调用的方法
*/
public void finish(){
//刷新完毕后的业务逻辑
if(currentState == IS_REFRESHING){
refresh_header_progressbar.setVisibility(View.INVISIBLE);
refresh_header_imageview.setVisibility(View.VISIBLE);
refresh_header_text.setText("下拉刷新");
currentState = PULL_REFRESH;
refresh_header_view.setPadding(0, -headerHeight, 0, 0);
}
//加载完毕后的逻辑
if(isload){
//隐藏脚底
refresh_footer_root.setPadding(0, -footerHeight, 0, 0);
isload = false;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
//当前downY的值是无限趋近与downY的值
if(downY == -1){
downY = (int) ev.getY();
}
int moveY = (int) ev.getY();
//当前的刷新头还隐藏的距离
int padding = -headerHeight+moveY-downY;
//获取轮播图图片左上角的位置
int [] locationCustomerView = new int[2];
//就将当前view的左上角的(x,y)的坐标赋值给locationCustomerView
customerView.getLocationOnScreen(locationCustomerView);
int customerViewY = locationCustomerView[1];
//listView左上角的位置
int[] locationListView = new int[2];
this.getLocationOnScreen(locationListView);
int listY = locationListView[1];
if(listY>customerViewY){
break;
}
if(padding>-headerHeight && mfirstVisibleItem==0){
//向下滑动并且第一个条目可见,做下拉刷新操作
//下拉刷新
//释放刷新
//正在刷新
if(padding>0 && currentState == PULL_REFRESH){
currentState = RELEASE_REFRESH;
setCurrentOption();
}
if(padding<0 && currentState == RELEASE_REFRESH){
currentState = PULL_REFRESH;
setCurrentOption();
}
refresh_header_view.setPadding(0, padding, 0, 0);
//保证后续的事件去做响应,up事件做响应
return true;
}
break;
case MotionEvent.ACTION_UP:
if(currentState == RELEASE_REFRESH){
//如果手指放开,就真的要去做刷新操作,改为刷新操作的状态
currentState = IS_REFRESHING;
//完整的显示刷新头
refresh_header_view.setPadding(0, 0, 0, 0);
setCurrentOption();
//刷新的逻辑,回调(定义一个接口,为实现的方法(刷新逻辑的方法),谁用谁实现,在合理的地方调用当前方法)
if(onRefreshListener!=null){
//刷新逻辑
onRefreshListener.pullDownRefresh();
}
// //模拟网络请求操作
// if(handler!=null){
// handler.sendEmptyMessageDelayed(0,3000);
// }
}else if(currentState == PULL_REFRESH){
//弹回操作
refresh_header_view.setPadding(0, -headerHeight, 0, 0);
}
break;
}
return super.onTouchEvent(ev);
}
private void setCurrentOption() {
switch (currentState) {
case RELEASE_REFRESH:
//修改下拉刷新文字为释放刷新
refresh_header_text.setText("释放刷新");
refresh_header_imageview.startAnimation(rotateAnimationUp);
break;
case PULL_REFRESH:
//修改下拉刷新文字为释放刷新
refresh_header_text.setText("下拉刷新");
refresh_header_imageview.startAnimation(rotateAnimationDown);
break;
case IS_REFRESHING:
refresh_header_text.setText("正在刷新");
refresh_header_imageview.clearAnimation();
refresh_header_imageview.setVisibility(View.GONE);
refresh_header_progressbar.setVisibility(View.VISIBLE);
refresh_header_time.setText(getTime());
break;
}
}
private String getTime() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
return dateFormat.format(date);
}
/**
* 添加viewpager轮播图的方法
* @param view
*/
public void addCustomerView(View view){
customerView = view;
refresh_header_root.addView(view);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
mfirstVisibleItem = firstVisibleItem;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//OnScrollListener.SCROLL_STATE_FLING 飞速滚动
//OnScrollListener.SCROLL_STATE_TOUCH_SCROLL 慢慢的滚动
//OnScrollListener.SCROLL_STATE_IDLE 滚动状态改变
if(scrollState == OnScrollListener.SCROLL_STATE_FLING
|| scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
if((getLastVisiblePosition() == getCount()-1) && !isload){
//加载逻辑
//底部的脚,显示出来
refresh_footer_root.setPadding(0, 0, 0, 0);
isload = true;
if(onRefreshListener!=null){
onRefreshListener.loadMore();
}
// handler.sendEmptyMessageDelayed(0, 2000);
}
}
}
}
浙公网安备 33010602011771号