博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android-ListView 下拉刷新
阅读量:5050 次
发布时间:2019-06-12

本文共 10919 字,大约阅读时间需要 36 分钟。

源码下载地址:

分享一个下拉刷新的解决的方法,效果图:

Main.java:

package example.com.list;import java.util.LinkedList;import example.com.list.R;import example.com.list.R.id;import example.com.list.R.layout;import example.com.list.MyListView.OnRefreshListener;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class MainActivity extends Activity {	private LinkedList
data; private BaseAdapter adapter; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); data = new LinkedList
(); for(int i=0;i<6;i++){ data.add(String.valueOf(i)); } final MyListView listView = (MyListView) findViewById(R.id.listView); adapter = new BaseAdapter() { public View getView(int position, View convertView, ViewGroup parent) { convertView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null); TextView textView = (TextView) convertView.findViewById(R.id.textView_item); textView.setText(data.get(position)); return convertView; } public long getItemId(int position) { return position; } public Object getItem(int position) { return data.get(position); } public int getCount() { return data.size(); } }; listView.setAdapter(adapter); listView.setonRefreshListener(new OnRefreshListener() { public void onRefresh() { new AsyncTask
() { protected Void doInBackground(Void... params) { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { adapter.notifyDataSetChanged(); listView.onRefreshComplete(); } }; } }); }}
ListView.java:

package example.com.list;import java.text.SimpleDateFormat;import java.util.Date;import example.com.list.R;import example.com.list.R.drawable;import example.com.list.R.id;import example.com.list.R.layout;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.LinearInterpolator;import android.view.animation.RotateAnimation;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ProgressBar;import android.widget.TextView;public class MyListView extends ListView implements OnScrollListener {	private static final String TAG = "listview";	private final static int RELEASE_To_REFRESH = 0; //释放刷新 	private final static int PULL_To_REFRESH = 1;//拉动刷新 	private final static int REFRESHING = 2;//正在刷新 	private final static int DONE = 3;	private final static int LOADING = 4;	// 实际的padding的距离与界面上偏移距离的比例 	private final static int RATIO = 3;	private LayoutInflater inflater;	private LinearLayout headView;	private TextView tipsTextview;	private TextView lastUpdatedTextView;	private ImageView arrowImageView;	private ProgressBar progressBar;	private RotateAnimation animation;	private RotateAnimation reverseAnimation;	 // 用于保证startY的值在一个完整的touch事件中仅仅被记录一次 	private boolean isRecored;	private int headContentWidth;	private int headContentHeight;	private int startY;	private int firstItemIndex;	private int state;	private boolean isBack;	private OnRefreshListener refreshListener;	private boolean isRefreshable;	public MyListView(Context context) {		super(context);		init(context);	}	public MyListView(Context context, AttributeSet attrs) {		super(context, attrs);		init(context);	}	private void init(Context context) {		//setCacheColorHint(context.getResources().getColor(R.color.transparent));		inflater = LayoutInflater.from(context);		headView = (LinearLayout) inflater.inflate(R.layout.head, null);		arrowImageView = (ImageView) headView				.findViewById(R.id.head_arrowImageView);		arrowImageView.setMinimumWidth(70);		arrowImageView.setMinimumHeight(50);		progressBar = (ProgressBar) headView				.findViewById(R.id.head_progressBar);		tipsTextview = (TextView) headView.findViewById(R.id.head_tipsTextView);		lastUpdatedTextView = (TextView) headView				.findViewById(R.id.head_lastUpdatedTextView);		measureView(headView);		headContentHeight = headView.getMeasuredHeight();		headContentWidth = headView.getMeasuredWidth();		headView.setPadding(0, -1 * headContentHeight, 0, 0);		headView.invalidate();		addHeaderView(headView, null, false);		setOnScrollListener(this);		animation = new RotateAnimation(0, -180,				RotateAnimation.RELATIVE_TO_SELF, 0.5f,				RotateAnimation.RELATIVE_TO_SELF, 0.5f);		animation.setInterpolator(new LinearInterpolator());		animation.setDuration(250);		animation.setFillAfter(true);		reverseAnimation = new RotateAnimation(-180, 0,				RotateAnimation.RELATIVE_TO_SELF, 0.5f,				RotateAnimation.RELATIVE_TO_SELF, 0.5f);		reverseAnimation.setInterpolator(new LinearInterpolator());		reverseAnimation.setDuration(200);		reverseAnimation.setFillAfter(true);		state = DONE;		isRefreshable = false;	}	public void onScroll(AbsListView arg0, int firstVisiableItem, int arg2,			int arg3) {		firstItemIndex = firstVisiableItem;	}	public void onScrollStateChanged(AbsListView arg0, int arg1) {	}	public boolean onTouchEvent(MotionEvent event) {		if (isRefreshable) {			switch (event.getAction()) {			case MotionEvent.ACTION_DOWN:				if (firstItemIndex == 0 && !isRecored) {					isRecored = true;					startY = (int) event.getY();				}				break;			case MotionEvent.ACTION_UP:				if (state != REFRESHING && state != LOADING) {					if (state == DONE) {					}					if (state == PULL_To_REFRESH) {						state = DONE;						changeHeaderViewByState();					}					if (state == RELEASE_To_REFRESH) {						state = REFRESHING;						changeHeaderViewByState();						onRefresh();					}				}				isRecored = false;				isBack = false;				break;			case MotionEvent.ACTION_MOVE:				int tempY = (int) event.getY();				if (!isRecored && firstItemIndex == 0) {							isRecored = true;					startY = tempY;				}				if (state != REFRESHING && isRecored && state != LOADING) {					 // 保证在设置padding的过程中,当前的位置一直是在head,否则假设当列表超出屏幕的话,当在上推的时候,列表会同一时候进行滚动					// 能够松手去刷新了					if (state == RELEASE_To_REFRESH) {						setSelection(0);						 // 往上推了。推到了屏幕足够掩盖head的程度,可是还没有推到所有掩盖的地步						if (((tempY - startY) / RATIO < headContentHeight)								&& (tempY - startY) > 0) {							state = PULL_To_REFRESH;							changeHeaderViewByState();						}						// 一下子推到顶了 						else if (tempY - startY <= 0) {							state = DONE;							changeHeaderViewByState();						}						// 往下拉了,或者还没有上推到屏幕顶部掩盖head的地步						else {							// 不用进行特别的操作,仅仅用更新paddingTop的值即可了						}					}					// 还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态 					if (state == PULL_To_REFRESH) {						setSelection(0);						// 下拉到能够进入RELEASE_TO_REFRESH的状态						if ((tempY - startY) / RATIO >= headContentHeight) {							state = RELEASE_To_REFRESH;							isBack = true;							changeHeaderViewByState();						}						// 上推到顶了						else if (tempY - startY <= 0) {							state = DONE;							changeHeaderViewByState();						}					}					// done状态下 					if (state == DONE) {						if (tempY - startY > 0) {							state = PULL_To_REFRESH;							changeHeaderViewByState();						}					}					// 更新headView的size					if (state == PULL_To_REFRESH) {						headView.setPadding(0, -1 * headContentHeight								+ (tempY - startY) / RATIO, 0, 0);					}					// 更新headView的paddingTop 					if (state == RELEASE_To_REFRESH) {						headView.setPadding(0, (tempY - startY) / RATIO								- headContentHeight, 0, 0);					}				}				break;			}		}		return super.onTouchEvent(event);	}	// 当状态改变时候。调用该方法,以更新界面 	private void changeHeaderViewByState() {		switch (state) {		case RELEASE_To_REFRESH:			arrowImageView.setVisibility(View.VISIBLE);			progressBar.setVisibility(View.GONE);			tipsTextview.setVisibility(View.VISIBLE);			lastUpdatedTextView.setVisibility(View.VISIBLE);			arrowImageView.clearAnimation();			arrowImageView.startAnimation(animation);			tipsTextview.setText("Release");			break;		case PULL_To_REFRESH:			progressBar.setVisibility(View.GONE);			tipsTextview.setVisibility(View.VISIBLE);			lastUpdatedTextView.setVisibility(View.VISIBLE);			arrowImageView.clearAnimation();			arrowImageView.setVisibility(View.VISIBLE);			// 是由RELEASE_To_REFRESH状态转变来的			if (isBack) {				isBack = false;				arrowImageView.clearAnimation();				arrowImageView.startAnimation(reverseAnimation);				tipsTextview.setText("Pull down");			} else {				tipsTextview.setText("Pull down");			}			break;		case REFRESHING:			headView.setPadding(0, 0, 0, 0);			progressBar.setVisibility(View.VISIBLE);			arrowImageView.clearAnimation();			arrowImageView.setVisibility(View.GONE);			tipsTextview.setText("Refreshing...");			lastUpdatedTextView.setVisibility(View.VISIBLE);			break;		case DONE:			headView.setPadding(0, -1 * headContentHeight, 0, 0);			progressBar.setVisibility(View.GONE);			arrowImageView.clearAnimation();			arrowImageView.setImageResource(R.drawable.arrow_down);			tipsTextview.setText("Pull down");			lastUpdatedTextView.setVisibility(View.VISIBLE);			break;		}	}	public void setonRefreshListener(OnRefreshListener refreshListener) {		this.refreshListener = refreshListener;		isRefreshable = true;	}	public interface OnRefreshListener {		public void onRefresh();	}	public void onRefreshComplete() {		state = DONE;		SimpleDateFormat format=new SimpleDateFormat("yyyy.MM.dd. HH:mm");		String date=format.format(new Date());		lastUpdatedTextView.setText("recently:" + date);		changeHeaderViewByState();	}	private void onRefresh() {		if (refreshListener != null) {			refreshListener.onRefresh();		}	}	private void measureView(View child) {		 ViewGroup.LayoutParams p = child.getLayoutParams();	        if (p == null) {	            p = new ViewGroup.LayoutParams(	                    ViewGroup.LayoutParams.FILL_PARENT,	                    ViewGroup.LayoutParams.WRAP_CONTENT);	        }	        int childWidthSpec = ViewGroup.getChildMeasureSpec(0,	                0 + 0, p.width);	        int lpHeight = p.height;	        int childHeightSpec;	        if (lpHeight > 0) {	            childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);	        } else {	            childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);	        }	        child.measure(childWidthSpec, childHeightSpec);	}	public void setAdapter(BaseAdapter adapter) {		SimpleDateFormat format=new SimpleDateFormat("yyyy.MM.dd. HH:mm");		String date=format.format(new Date());		lastUpdatedTextView.setText("recently:" + date);		super.setAdapter(adapter);	}}

转载于:https://www.cnblogs.com/jzdwajue/p/6751651.html

你可能感兴趣的文章
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
SVN服务器搭建和使用(三)(转载)
查看>>
Android 自定义View (三) 圆环交替 等待效果
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
Eclipse 调试的时候Tomcat报错启动不了
查看>>
【安卓5】高级控件——拖动条SeekBar
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android入门之文件系统操作(二)文件操作相关指令
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
Swift 中的指针使用
查看>>
Swift - 使用闭包筛选过滤数据元素
查看>>
alue of type java.lang.String cannot be converted to JSONObject
查看>>