zoukankan      html  css  js  c++  java
  • 赵雅智_名片夹(3)_下拉刷新载入很多其它

    转载请标明地址:http://blog.csdn.net/zhaoyazhi2129/article/details/38751681

    效果图


    新建刷新的头部布局

    <?xml version="1.0" encoding="utf-8"?

    > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="bottom" > <RelativeLayout android:id="@+id/listview_header_content" android:layout_width="fill_parent" android:layout_height="60dp" > <LinearLayout android:id="@+id/listview_header_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/listview_header_hint_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/listview_header_hint_normal" android:textColor="@color/tvcolor"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/listview_header_last_time" android:textSize="12sp" android:textColor="@color/tvcolor"/> <TextView android:id="@+id/listview_header_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:textColor="@color/tvcolor" /> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/listview_header_arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/listview_header_text" android:layout_centerVertical="true" android:layout_marginLeft="-35dp" android:src="@drawable/listview_arrow" /> <ProgressBar android:id="@+id/listview_header_progressbar" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignLeft="@id/listview_header_text" android:layout_centerVertical="true" android:layout_marginLeft="-40dp" android:visibility="invisible" /> </RelativeLayout> </LinearLayout>


    在工具包下自己定义头部信息

    PullListViewHeader.java

    package com.cards.basic.util;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.animation.Animation;
    import android.view.animation.RotateAnimation;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    
    import com.cards.R;
    
    /**
     * 
     * @explaination 下拉载入很多其它
     * @author yazhizhao
     * @time 2014-8-1上午11:30:35
     */
    public class PullListViewHeader extends LinearLayout {
    	private LinearLayout mContainer;
    	private ImageView mArrowImageView;
    	private ProgressBar mProgressBar;
    	private TextView mHintTextView;
    	private int mState = STATE_NORMAL;
    	private Animation mRotateUpAnim;
    	private Animation mRotateDownAnim;
    	
    	private final int ROTATE_ANIM_DURATION = 180;
    	
    	public final static int STATE_NORMAL = 0;
    	public final static int STATE_READY = 1;
    	public final static int STATE_REFRESHING = 2;
    
    	public PullListViewHeader(Context context) {
    		super(context);
    		initView(context);
    	}
    
    	/**
    	 * @param context
    	 * @param attrs
    	 */
    	public PullListViewHeader(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		initView(context);
    	}
    
    	private void initView(Context context) {
    		// 初始情况,设置下拉刷新view高度为0
    		LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    				LayoutParams.FILL_PARENT, 0);
    		mContainer = (LinearLayout) LayoutInflater.from(context).inflate(
    				R.layout.listview_header, null);
    		addView(mContainer, lp);
    		setGravity(Gravity.BOTTOM);
    
    		mArrowImageView = (ImageView)findViewById(R.id.listview_header_arrow);
    		mHintTextView = (TextView)findViewById(R.id.listview_header_hint_textview);
    		mProgressBar = (ProgressBar)findViewById(R.id.listview_header_progressbar);
    		
    		mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
    				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
    				0.5f);
    		mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
    		mRotateUpAnim.setFillAfter(true);
    		mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
    				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
    				0.5f);
    		mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);
    		mRotateDownAnim.setFillAfter(true);
    	}
    
    	public void setState(int state) {
    		if (state == mState) return ;
    		
    		if (state == STATE_REFRESHING) {	// 显示运行进度
    			mArrowImageView.clearAnimation();
    			mArrowImageView.setVisibility(View.INVISIBLE);
    			mProgressBar.setVisibility(View.VISIBLE);
    		} else {	// 显示箭头图片
    			mArrowImageView.setVisibility(View.VISIBLE);
    			mProgressBar.setVisibility(View.INVISIBLE);
    		}
    		
    		switch(state){
    		case STATE_NORMAL:
    			if (mState == STATE_READY) {
    				mArrowImageView.startAnimation(mRotateDownAnim);
    			}
    			if (mState == STATE_REFRESHING) {
    				mArrowImageView.clearAnimation();
    			}
    			mHintTextView.setText(R.string.listview_header_hint_normal);
    			break;
    		case STATE_READY:
    			if (mState != STATE_READY) {
    				mArrowImageView.clearAnimation();
    				mArrowImageView.startAnimation(mRotateUpAnim);
    				mHintTextView.setText(R.string.listview_header_hint_ready);
    			}
    			break;
    		case STATE_REFRESHING:
    			mHintTextView.setText(R.string.listview_header_hint_loading);
    			break;
    			default:
    		}
    		
    		mState = state;
    	}
    	
    	public void setVisiableHeight(int height) {
    		if (height < 0)
    			height = 0;
    		LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContainer
    				.getLayoutParams();
    		lp.height = height;
    		mContainer.setLayoutParams(lp);
    	}
    
    	public int getVisiableHeight() {
    		return mContainer.getHeight();
    	}
    
    }
    

    在工具包下创建listview的自己定义文件

    PullListView.java
    package com.cards.basic.util;
    
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewTreeObserver.OnGlobalLayoutListener;
    import android.view.animation.DecelerateInterpolator;
    import android.widget.AbsListView;
    import android.widget.AbsListView.OnScrollListener;
    import android.widget.ListView;
    import android.widget.RelativeLayout;
    import android.widget.Scroller;
    import android.widget.TextView;
    
    import com.cards.R;
    /**
     * 
     * @explaination 下拉载入很多其它
     * @author yazhizhao
     * @time 2014-8-1上午11:30:45
     */
    public class PullListView extends ListView implements OnScrollListener {
    
    	private float mLastY = -1; // y
    	private Scroller mScroller; // 用于回滚
    	private OnScrollListener mScrollListener; // 回滚监听
    	// 接口触发刷新和负载很多其它
    	private IXListViewListener mListViewListener;
    	//
    	private PullListViewHeader mHeaderView;
    	// 整个头部布局
    	private RelativeLayout mHeaderViewContent;
    	// 上次刷新的时间布局
    	private TextView mHeaderTimeView;
    	// 头部的高度
    	private int mHeaderViewHeight;
    	private boolean mEnablePullRefresh = true;
    	// 是否刷新
    	private boolean mPullRefreshing = false;
    
    	// 总共的条数
    	private int mTotalItemCount;
    
    	// 对于照片卷轴,卷轴回来页眉或页脚。
    	private int mScrollBack;
    	private final static int SCROLLBACK_HEADER = 0;
    
    	private final static int SCROLL_DURATION = 400; // scroll back duration
    
    	private final static float OFFSET_RADIO = 1.8f; // support iOS like pull
    													// feature.
    
    	/**
    	 * @param context
    	 */
    	public PullListView(Context context) {
    		super(context);
    		initWithContext(context);
    	}
    
    	public PullListView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		initWithContext(context);
    	}
    
    	public PullListView(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    		initWithContext(context);
    	}
    
    	// ListView须要滚动事件,它将调度事件,用户的侦听器(作为一个代理
    	private void initWithContext(Context context) {
    		mScroller = new Scroller(context, new DecelerateInterpolator());
    		super.setOnScrollListener(this);
    		// 初始化控件
    		mHeaderView = new PullListViewHeader(context);
    		mHeaderViewContent = (RelativeLayout) mHeaderView
    				.findViewById(R.id.listview_header_content);
    		mHeaderTimeView = (TextView) mHeaderView
    				.findViewById(R.id.listview_header_time);
    		addHeaderView(mHeaderView);
    
    		// 初始化头部信息
    		mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
    				new OnGlobalLayoutListener() {
    					@Override
    					public void onGlobalLayout() {
    						mHeaderViewHeight = mHeaderViewContent.getHeight();
    						getViewTreeObserver()
    								.removeGlobalOnLayoutListener(this);
    					}
    				});
    	}
    
    	/**
    	 * 启用或禁用拉刷新功能
    	 * 
    	 * @param enable
    	 */
    	public void setPullRefreshEnable(boolean enable) {
    		// 是否刷新
    		mEnablePullRefresh = enable;
    		// 假设不是刷新
    		if (!mEnablePullRefresh) {
    			mHeaderViewContent.setVisibility(View.INVISIBLE);
    		} else {
    			// 假设是刷新
    			mHeaderViewContent.setVisibility(View.VISIBLE);
    		}
    	}
    
    	/**
    	 * 停止刷新,复位标题视图
    	 */
    	public void stopRefresh() {
    		if (mPullRefreshing == true) {
    			mPullRefreshing = false;
    			resetHeaderHeight();
    		}
    	}
    
    	/**
    	 * 设置最后刷新时间
    	 * 
    	 * @param time
    	 */
    	public void setRefreshTime(String time) {
    		mHeaderTimeView.setText(time);
    	}
    
    	private void invokeOnScrolling() {
    		if (mScrollListener instanceof OnXScrollListener) {
    			OnXScrollListener l = (OnXScrollListener) mScrollListener;
    			l.onXScrolling(this);
    		}
    	}
    
    	private void updateHeaderHeight(float delta) {
    		mHeaderView.setVisiableHeight((int) delta
    				+ mHeaderView.getVisiableHeight());
    		if (mEnablePullRefresh && !mPullRefreshing) { // 未处于刷新状态,更新箭头
    			if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
    				mHeaderView.setState(PullListViewHeader.STATE_READY);
    			} else {
    				mHeaderView.setState(PullListViewHeader.STATE_NORMAL);
    			}
    		}
    		setSelection(0); // 滚动到顶部每一个时间
    	}
    
    	/**
    	 * 重置头的高度
    	 */
    	private void resetHeaderHeight() {
    		int height = mHeaderView.getVisiableHeight();
    		if (height == 0) // 不显示
    			return;
    		// 刷新而且头部不全然显示,而且什么也不做
    		if (mPullRefreshing && height <= mHeaderViewHeight) {
    			return;
    		}
    		int finalHeight = 0; // 默认值:滚动回驳回头.
    		// 刷新。回滚显示全部的头部信息
    		if (mPullRefreshing && height > mHeaderViewHeight) {
    			finalHeight = mHeaderViewHeight;
    		}
    		mScrollBack = SCROLLBACK_HEADER;
    		mScroller.startScroll(0, height, 0, finalHeight - height,
    				SCROLL_DURATION);
    		invalidate();
    	}
    
    	@Override
    	public boolean onTouchEvent(MotionEvent ev) {
    		if (mLastY == -1) {
    			mLastY = ev.getRawY();
    		}
    
    		switch (ev.getAction()) {
    		case MotionEvent.ACTION_DOWN:
    			mLastY = ev.getRawY();
    			break;
    		case MotionEvent.ACTION_MOVE:
    			final float deltaY = ev.getRawY() - mLastY;
    			mLastY = ev.getRawY();
    			if (getFirstVisiblePosition() == 0
    					&& (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {
    				// 第一项是显示,标题显示或拉下来
    				updateHeaderHeight(deltaY / OFFSET_RADIO);
    				invokeOnScrolling();
    			}
    			break;
    		default:
    			mLastY = -1; // 重置
    			if (getFirstVisiblePosition() == 0) {
    				// 调用刷新
    				if (mEnablePullRefresh
    						&& mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
    					mPullRefreshing = true;
    					mHeaderView.setState(PullListViewHeader.STATE_REFRESHING);
    					if (mListViewListener != null) {
    						mListViewListener.onRefresh();
    					}
    				}
    				resetHeaderHeight();
    			}
    			break;
    		}
    		return super.onTouchEvent(ev);
    	}
    
    	@Override
    	public void computeScroll() {
    		if (mScroller.computeScrollOffset()) {
    			if (mScrollBack == SCROLLBACK_HEADER) {
    				mHeaderView.setVisiableHeight(mScroller.getCurrY());
    			}
    			postInvalidate();
    			invokeOnScrolling();
    		}
    		super.computeScroll();
    	}
    
    	@Override
    	public void setOnScrollListener(OnScrollListener l) {
    		mScrollListener = l;
    	}
    
    	@Override
    	public void onScrollStateChanged(AbsListView view, int scrollState) {
    		if (mScrollListener != null) {
    			mScrollListener.onScrollStateChanged(view, scrollState);
    		}
    	}
    
    	@Override
    	public void onScroll(AbsListView view, int firstVisibleItem,
    			int visibleItemCount, int totalItemCount) {
    		// 发送到用户的侦听器
    		mTotalItemCount = totalItemCount;
    		if (mScrollListener != null) {
    			mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,
    					totalItemCount);
    		}
    	}
    
    	public void setXListViewListener(IXListViewListener l) {
    		mListViewListener = l;
    	}
    
    	/**
    	 * 你能够听列表视图。

    OnScrollListener或这一个。它将调用onXScrolling当标题/页脚滚动回。

    */ public interface OnXScrollListener extends OnScrollListener { public void onXScrolling(View view); } /** * 实现这个接口获取/负载很多其它的事件,刷新 */ public interface IXListViewListener { public void onRefresh(); public void onLoadMore(); } }


    在布局文件里使用自己定义的PullListView文件

      <com.cards.basic.util.PullListView
            android:id="@+id/lv_changelist"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_below="@+id/titlebar_above"
            android:layout_margin="10dp"
            android:cacheColorHint="#00000000"
            android:divider="#00000000"
            android:fadingEdge="none"
            android:listSelector="#00000000" >
        </com.cards.basic.util.PullListView>
    

    在相应的activity类实现IXListViewListener接口,并继承onRefresh和onLoadMore方法

    package com.cards.activity;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.cards.R;
    import com.cards.adapter.ChangeCardAdapter;
    import com.cards.basic.util.PullListView;
    import com.cards.basic.util.PullListView.IXListViewListener;
    import com.cards.commom.Common;
    import com.cards.commom.MyApp;
    import com.cards.entity.Findf;
    import com.cards.manager.ChangeMgr;
    
    /**
     * @explaination 交换名片
     * @author yazhizhao
     * @time 2014-7-8上午9:30:59
     */
    public class ChangeCardAct extends Activity implements IXListViewListener {
    
    	private ChangeCardAdapter adapter;
    	private Handler mHandler;
    	private PullListView pointList;
    	private List<Findf> list;
    	private ChangeMgr changeMgr;
    	private Button btnRegistered;
    	private MessageThread messageThread;
    	private SharedPreferences sp;
    	private int size;
    	private ImageView imageView1;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.act_change_card);
    		// 用于安全退出
    		MyApp.getInstance().addActivity(this);
    
    		// 设置标题
    		TextView tvTitleCommenCenter = (TextView) findViewById(R.id.tv_title);
    		tvTitleCommenCenter.setText("发现");
    		
    		// 查看交换请求
    		btnRegistered = (Button) findViewById(R.id.btn_right_title);
    		btnRegistered.setOnClickListener(new OnClickListener() {
    
    			public void onClick(View v) {
    				startActivity(new Intent().setClass(ChangeCardAct.this, ChangeReqAct.class));
    			}
    		});
    
    	
    		// 开启线程
    		messageThread = new MessageThread();
    		messageThread.start();
    		// 获取附近人
    		changeMgr = new ChangeMgr(ChangeCardAct.this, handler);
    		changeMgr.findF();
    		mHandler = new Handler();
    		//是否收到交换信息
    		changeHint();
    	}
    
    	/**
    	 * 
    	 * @explaination 是否收到交换信息
    	 * @author yazhizhao
    	 * @time 2014-8-22上午10:19:39
    	 */
    	private void changeHint() {
    		sp = getSharedPreferences("common_data", MODE_PRIVATE);
    		size = sp.getInt("Status_size", 0);
    		imageView1 = (ImageView) findViewById(R.id.imageView1);
    		if (size > 0) {
    			imageView1.setVisibility(View.VISIBLE);
    		} else if (size == 0) {
    			imageView1.setVisibility(View.GONE);
    		}
    	}
    
    	/**
    	 * 
    	 * @explaination 新开启线程一直请求有没有人交换
    	 * @author yazhizhao
    	 * @time 2014-7-25下午5:20:36
    	 */
    	class MessageThread extends Thread {
    		public void run() {
    			while (true) {
    				try {
    					// 请求有没有人交换
    					changeMgr.friendInfo();
    					//是否收到交换信息
    					changeHint();
    					Thread.sleep(1000 * 6);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    
    	}
    
    	/**
    	 * 消息处理机制
    	 */
    	private Handler handler = new Handler() {
    
    		@Override
    		public void handleMessage(Message msg) {
    
    			Common.cancelLoading();
    			switch (msg.what) {
    			case 0:
    				Bundle bundle = msg.getData();
    				ArrayList arraylist = bundle.getParcelableArrayList("list");
    				list = (List<Findf>) arraylist.get(0);
    				pointList = (PullListView) findViewById(R.id.lv_changelist);
    				adapter = new ChangeCardAdapter(ChangeCardAct.this, list,
    						handler);
    				pointList.setAdapter(adapter);
    				pointList.setXListViewListener(ChangeCardAct.this);
    				break;
    
    			case 2:
    				pointList = (PullListView) findViewById(R.id.lv_changelist);
    				list = new ArrayList<Findf>();
    				adapter = new ChangeCardAdapter(ChangeCardAct.this, list,
    						handler);
    				pointList.setAdapter(adapter);
    				pointList.setXListViewListener(ChangeCardAct.this);
    				break;
    
    			}
    
    		}
    	};
    
    	@Override
    	protected void onStart() {
    		// 用于安全退出
    		MyApp.getInstance().addActivity(this);
    		super.onStart();
    	}
    
    	/**
    	 * 
    	 * @explaination 下拉刷新设置上次时间
    	 * @author yazhizhao
    	 * @time 2014-7-28上午11:10:51
    	 * @return
    	 */
    	private String getCurrentDate() {
    		SimpleDateFormat sdf = new java.text.SimpleDateFormat(
    				"yyyy-MM-dd HH:mm:ss");
    		String str = sdf.format(new java.util.Date());
    		return str;
    	}
    
    	/**
    	 * 
    	 * @explaination 下拉刷新
    	 * @author yazhizhao
    	 * @time 2014-7-28上午11:10:51
    	 */
    	@Override
    	public void onRefresh() {
    		mHandler.postDelayed(new Runnable() {
    			@Override
    			public void run() {
    				onReload();
    				changeHint();
    				onLoad();
    			}
    		}, 2000);
    
    	}
    	/**
    	 * 
    	 * @explaination 载入很多其它
    	 * @author yazhizhao
    	 * @time 2014-7-28上午11:10:51
    	 */
    	@Override
    	public void onLoadMore() {
    		mHandler.postDelayed(new Runnable() {
    			@Override
    			public void run() {
    
    			}
    		}, 2000);
    	}
    
    	@Override
    	protected void onResume() {
    		// 把定位状态设置为第一次定位
    		changeMgr.findF();
    		changeHint();
    		super.onResume();
    	}
    
    	/**
    	 * 
    	 * @explaination 停止刷新并设置时间
    	 * @author yazhizhao
    	 * @time 2014-8-22上午10:23:47
    	 */
    	private void onLoad() {
    		pointList.stopRefresh();
    		pointList.setRefreshTime(getCurrentDate());
    	}
    	/**
    	 * 
    	 * @explaination 再次刷新
    	 * @author yazhizhao
    	 * @time 2014-8-22上午10:23:50
    	 */
    	public boolean onReload() {
    		boolean result = true;
    		changeMgr.findF();
    		return result;
    	}
    }
    


  • 相关阅读:
    [LeetCode] Add Two Numbers
    [LeetCode] Two Sum
    解决 wget 使用 https 下载报错的问题
    VMware Player 使用笔记
    使用 linux 作为桌面系统会遇到的一些小问题和解决方案
    CUDA 6.5 + Visual Studio 2013 Express 环境配置
    康威生命游戏(Conway's Game of Life)的一种实现
    微软校招编程题"Beautiful String"的状态机解法
    利用html5的本地存储写的一个购物车
    微信开发asp.net
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6836559.html
Copyright © 2011-2022 走看看