标签:
下拉刷新
public class RefreshListView extends ListView implements OnScrollListener{private View headerView;//headerViewprivate ImageView iv_arrow;private ProgressBar pb_rotate;private TextView tv_state,tv_time;private View footerView;private int footerViewHeight;private int headerViewHeight;//headerView高private int downY;//按下时y坐标private final int PULL_REFRESH = 0;//下拉刷新的状态private final int RELEASE_REFRESH = 1;//松开刷新的状态private final int REFRESHING = 2;//正在刷新的状态private int currentState = PULL_REFRESH;private RotateAnimation upAnimation,downAnimation;private boolean isLoadingMore = false;//当前是否正在处于加载更多public RefreshListView(Context context) {super(context);init();}public RefreshListView(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init(){setOnScrollListener(this);initHeaderView();initRotateAnimation();initFooterView();}/*** 初始化headerView*/private void initHeaderView() {headerView = View.inflate(getContext(), R.layout.layout_header, null);iv_arrow = (ImageView) headerView.findViewById(R.id.iv_arrow);pb_rotate = (ProgressBar) headerView.findViewById(R.id.pb_rotate);tv_state = (TextView) headerView.findViewById(R.id.tv_state);tv_time = (TextView) headerView.findViewById(R.id.tv_time);headerView.measure(0, 0);//主动通知系统去测量该view;headerViewHeight = headerView.getMeasuredHeight();headerView.setPadding(0, -headerViewHeight, 0, 0);addHeaderView(headerView);}/*** 初始化旋转动画*/private void initRotateAnimation() {upAnimation = new RotateAnimation(0, -180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);upAnimation.setDuration(300);upAnimation.setFillAfter(true);downAnimation = new RotateAnimation(-180, -360,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);downAnimation.setDuration(300);downAnimation.setFillAfter(true);}private void initFooterView() {footerView = View.inflate(getContext(), R.layout.layout_footer, null);footerView.measure(0, 0);//主动通知系统去测量该view;footerViewHeight = footerView.getMeasuredHeight();footerView.setPadding(0, -footerViewHeight, 0, 0);addFooterView(footerView);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:downY = (int) ev.getY();break;case MotionEvent.ACTION_MOVE:if(currentState==REFRESHING){break;}int deltaY = (int) (ev.getY() - downY);int paddingTop = -headerViewHeight + deltaY;if(paddingTop>-headerViewHeight && getFirstVisiblePosition()==0){headerView.setPadding(0, paddingTop, 0, 0);// Log.e("RefreshListView", "paddingTop: "+paddingTop);if(paddingTop>=0 && currentState==PULL_REFRESH){//从下拉刷新进入松开刷新状态currentState = RELEASE_REFRESH;refreshHeaderView();}else if (paddingTop<0 && currentState==RELEASE_REFRESH) {//进入下拉刷新状态currentState = PULL_REFRESH;refreshHeaderView();}return true;//拦截TouchMove,不让listview处理该次move事件,会造成listview无法滑动}break;case MotionEvent.ACTION_UP:if(currentState==PULL_REFRESH){//隐藏headerViewheaderView.setPadding(0, -headerViewHeight, 0, 0);}else if (currentState==RELEASE_REFRESH) {headerView.setPadding(0, 0, 0, 0);currentState = REFRESHING;refreshHeaderView();if(listener!=null){listener.onPullRefresh();}}break;}return super.onTouchEvent(ev);}/*** 根据currentState来更新headerView*/private void refreshHeaderView(){switch (currentState) {case PULL_REFRESH:tv_state.setText("下拉刷新");iv_arrow.startAnimation(downAnimation);break;case RELEASE_REFRESH:tv_state.setText("松开刷新");iv_arrow.startAnimation(upAnimation);break;case REFRESHING:iv_arrow.clearAnimation();//因为向上的旋转动画有可能没有执行完iv_arrow.setVisibility(View.INVISIBLE);pb_rotate.setVisibility(View.VISIBLE);tv_state.setText("正在刷新...");break;}}/*** 完成刷新操作,重置状态,在你获取完数据并更新完adater之后,去在UI线程中调用该方法*/public void completeRefresh(){if(isLoadingMore){//重置footerView状态footerView.setPadding(0, -footerViewHeight, 0, 0);isLoadingMore = false;}else {//重置headerView状态headerView.setPadding(0, -headerViewHeight, 0, 0);currentState = PULL_REFRESH;pb_rotate.setVisibility(View.INVISIBLE);iv_arrow.setVisibility(View.VISIBLE);tv_state.setText("下拉刷新");tv_time.setText("最后刷新:"+getCurrentTime());}}/*** 获取当前系统时间,并格式化* @return*/private String getCurrentTime(){SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");return format.format(new Date());}private OnRefreshListener listener;public void setOnRefreshListener(OnRefreshListener listener){this.listener = listener;}public interface OnRefreshListener{void onPullRefresh();void onLoadingMore();}/*** SCROLL_STATE_IDLE:闲置状态,就是手指松开* SCROLL_STATE_TOUCH_SCROLL:手指触摸滑动,就是按着来滑动* SCROLL_STATE_FLING:快速滑动后松开*/@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if(scrollState==OnScrollListener.SCROLL_STATE_IDLE&& getLastVisiblePosition()==(getCount()-1) &&!isLoadingMore){isLoadingMore = true;footerView.setPadding(0, 0, 0, 0);//显示出footerViewsetSelection(getCount());//让listview最后一条显示出来if(listener!=null){listener.onLoadingMore();}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {}}
public class MainActivity extends Activity {private RefreshListView refreshListView;private ArrayList<String> list = new ArrayList<String>();private MyAdapter adapter;private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {//更新UIadapter.notifyDataSetChanged();refreshListView.completeRefresh();};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initView();initData();}private void initView() {requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);refreshListView = (RefreshListView) findViewById(R.id.refreshListView);}private void initData() {for (int i = 0; i < 15; i++) {list.add("listview原来的数据 - "+i);}// final View headerView = View.inflate(this, R.layout.layout_header, null);//第一种方法// headerView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {// @Override// public void onGlobalLayout() {// headerView.getViewTreeObserver().removeGlobalOnLayoutListener(this);// int headerViewHeight = headerView.getHeight();////// Log.e("MainActivity", "headerViewHeight: "+headerViewHeight);// headerView.setPadding(0, -headerViewHeight, 0, 0);// refreshListView.addHeaderView(headerView);//// }// });//第二种方法// headerView.measure(0, 0);//主动通知系统去测量// int headerViewHeight = headerView.getMeasuredHeight();// Log.e("MainActivity", "headerViewHeight: "+headerViewHeight);// headerView.setPadding(0, -headerViewHeight, 0, 0);// refreshListView.addHeaderView(headerView);//adapter = new MyAdapter();refreshListView.setAdapter(adapter);refreshListView.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onPullRefresh() {//需要联网请求服务器的数据,然后更新UIrequestDataFromServer(false);}@Overridepublic void onLoadingMore() {requestDataFromServer(true);}});}/*** 模拟向服务器请求数据*/private void requestDataFromServer(final boolean isLoadingMore){new Thread(){public void run() {SystemClock.sleep(3000);//模拟请求服务器的一个时间长度if(isLoadingMore){list.add("加载更多的数据-1");list.add("加载更多的数据-2");list.add("加载更多的数据-3");}else {list.add(0, "下拉刷新的数据");}//在UI线程更新UIhandler.sendEmptyMessage(0);};}.start();}class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView textView = new TextView(MainActivity.this);textView.setPadding(20, 20, 20, 20);textView.setTextSize(18);textView.setText(list.get(position));return textView;}}}
标签:
原文地址:http://www.cnblogs.com/liuyu0529/p/5041934.html