您的位置:首页 > 其它

********随便看看**********

2015-05-04 19:59 288 查看
*********根据新浪微博随便看看实现下拉刷新功能*******

一、项目开发

1、 项目开发效果图





二、在android环境下建立连接和实现等,通过建立新的项目newProject,实现预期的功能

代码如下:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/liner"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:padding="6dip"

android:background="#FA8072">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="随便看看"

android:textSize="15sp"

android:textColor="@android:color/white"

/>

</LinearLayout>

<bzu.edu.hou.view.MyListView

android:id="@+id/myListView1"

android:layout_width="match_parent"

android:layout_height="wrap_content" >

</bzu.edu.hou.view.MyListView>

</LinearLayout>

2、获得数据源,并在MainActivity.java中获得数组资源

public class MainActivity extends Activity {

private MyListView mylistview=null;

private List<Messages> list_msg=null;

private BaseAdapter adapter=null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

init();

if(list_msg==null){

getData();

}

adapter=new ArticleAdapter(this,list_msg);

mylistview.setAdapter(adapter);

}

private void getData() {

// TODO Auto-generated method stub

//获得xml的资源

String names[];

String article[];

TypedArray img;

int i;

names=getResources().getStringArray(R.array.name);

article=getResources().getStringArray(R.array.article);

img=getResources().obtainTypedArray(R.array.head_photo);

list_msg=new ArrayList<Messages>();

for(i=0;i<names.length;i++){

Messages message=new Messages();

message.setImg(img.getDrawable(i));

message.setName(names[i]);

message.setArticel(article[i]);

message.setRq("人气:"+String.valueOf(new Random().nextInt(1000)));

Date date=new Date();

SimpleDateFormat simple=new SimpleDateFormat("MM-dd");

message.setTime(simple.format(date));

list_msg.add(message);

}

}

3,编写ArticleAdapter类。它继承BaseAdapter类,重写其方法,在getView并将List中的每一条数据都对应布局中的控件

public class ArticleAdapter extends BaseAdapter {

private List<Messages> list_mes=null;

private Context context;

public ArticleAdapter(Context context,List<Messages> list_mes) {

// TODO Auto-generated constructor stub

this.list_mes=list_mes;

this.context=context;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return list_mes.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return list_mes.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

ListItem listitem;

if(convertView==null)

{

convertView=(LinearLayout)LayoutInflater.from(context).inflate(R.layout.list_layout, null);

listitem=new ListItem();

listitem.img=(ImageView)convertView.findViewById(R.id.head_img);

listitem.name=(TextView)convertView.findViewById(R.id.name);

listitem.time=(TextView)convertView.findViewById(R.id.time);

listitem.rq=(TextView)convertView.findViewById(R.id.rq);

listitem.article=(TextView)convertView.findViewById(R.id.article);

convertView.setTag(listitem);

}else {

listitem=(ListItem)convertView.getTag();

}

listitem.img.setImageDrawable(list_mes.get(position).getImg());

listitem.name.setText(list_mes.get(position).getName());

listitem.time.setText(list_mes.get(position).getTime());

listitem.rq.setText(list_mes.get(position).getRq());

listitem.article.setText(list_mes.get(position).getArticel());

return convertView;

}

public class ListItem{

ImageView img;

TextView name;

TextView time;

TextView rq;

TextView article;

}

}

3、根据头部判定是否刷新

Handler handler=new Handler(new Handler.Callback() {		@Override		public boolean handleMessage(Message arg0) {			// TODO Auto-generated method stub			if(arg0.what==0){								//结束刷新				mylistview.endOnRersh();			}			return false;		}	});

class OnRershListener implements OnRersh{	    //实现刷新接口的 方法,,在MyList中会回调该方法。		//模拟		@Override		public void OnRershListener() {			// TODO Auto-generated method stub			new Thread(new Run()).start();//启动一个线程		}


class Run implements Runnable{		@Override		public void run() {			// TODO Auto-generated method stub			try {				Thread.sleep(2000);			} catch (Exception e) {				// TODO: handle exception				e.printStackTrace();			}			handler.sendEmptyMessage(0);		}	}


public class MyListView extends ListView {		private HeaderView head_view=null;	//起始的y坐标	private float pageY = 0f;	//阻尼器	private float DAMPER=1.25f;	private OnRersh onRershListener=null;
public MyListView(Context context, AttributeSet attrs) {		super(context, attrs);		// TODO Auto-generated constructor stub		initView(context);	}
private void initView(Context context) {		// TODO Auto-generated method stub		head_view=new HeaderView(context);		this.addHeaderView(head_view);	}
//触摸事件方法,发生屏幕按下、抬起、滑动,程序都回调该方法	@Override	public boolean onTouchEvent(MotionEvent ev) {		// TODO Auto-generated method stub		/**

switch (ev.getAction()) {				case MotionEvent.ACTION_DOWN:			pageY=ev.getY();			break;		case MotionEvent.ACTION_MOVE:			float move=0;//移动的距离			move=ev.getY()-pageY;			pageY=ev.getY();						if(head_view.getSTATE()!=HeaderView.UPDATA && getFirstVisiblePosition()==0 &&						(move/DAMPER+head_view.getHeaderViewHight())>0){				setHeaderViewHight(move/DAMPER);				return true;			}			break;		case MotionEvent.ACTION_UP:			switch (head_view.getSTATE()) {			case HeaderView.DOWN:				//下拉显示状态,不刷新,高度0				setHeaderViewHight(-head_view.getHeaderViewHight());				break;			case HeaderView.UPDATA:				//刷新状态				break;			case HeaderView.UP:				//开始刷新				setHeaderViewHight(75-head_view.getHeaderViewHight());//设置HeaderView的高为75				head_view.setSTATE(HeaderView.UPDATA);				head_view.setTime();				//调用刷新接口				if(onRershListener!=null){					onRershListener.OnRershListener();				}				break;			}			break;		}		return super.onTouchEvent(ev);	}


private void setHeaderViewHight(float f) {		// TODO Auto-generated method stub		//设置HeaderView的高度  并给HeaderView设置不同的状态。(不同的状态显示不同的header样式)		/*		 * 		 1, 调用Headeview的方法设置其高度		 2,判断Headeview的状态不是UPDATA		 	判断HeaderView的高度,来设置状态		 	(1)距离大于60---设置UP		 	(2)否则大于0---设置Down		 */		head_view.setHeaderViewHight((int)(f+head_view.getHeaderViewHight()));				if(head_view.getSTATE()!=HeaderView.UPDATA){						if(head_view.getHeaderViewHight()>75){				head_view.setSTATE(HeaderView.UP);//上拉状态			}else if(head_view.getHeaderViewHight()>0) {				head_view.setSTATE(HeaderView.DOWN);			}		}	}	public void setOnRershListener(OnRersh onRershListener) {		this.onRershListener = onRershListener;	}	/**结束刷新*/	public void endOnRersh() {		// TODO Auto-generated method stub		//状态设置为Down(默认的初始状态),高度0		head_view.setSTATE(HeaderView.DOWN);		head_view.setHeaderViewHight(-(int)head_view.getHeaderViewHight());	}}


4.HeaderView类:此类重写了LinearLayout

public class HeaderView extends LinearLayout {	private LinearLayout linear=null;		//当前状态	private int STATE=DOWN;	//下拉状态	public static final int DOWN=0;	//上拉状态	public static final int UP=1;	//刷新状态	public static final int UPDATA=2;		//布局控件	private TextView t1,t2=null;	private ImageView img=null;	private ProgressBar probar=null;		//旋转动画对象	private RotateAnimation rotate1,rotate2=null;		public HeaderView(Context context) {		super(context);		// TODO Auto-generated constructor stub		//初始化刷新头部		initView(context);	}
private void initView(Context context) {		// TODO Auto-generated method stub		/*		 1,加载header_view布局		 2,初始化创建动画对象		 * */		linear=(LinearLayout)LayoutInflater.from(context).inflate(R.layout.header_view, null);//加载布局,第二个对象表示根视图,null表示此布局是根视图。		LinearLayout.LayoutParams layoutparams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);		this.addView(linear, layoutparams);				//初始化布局控件		t1=(TextView)linear.findViewById(R.id.text);		t2=(TextView)linear.findViewById(R.id.text1);		img=(ImageView)linear.findViewById(R.id.pull);		probar=(ProgressBar)linear.findViewById(R.id.progress);				//创建动画对象		rotate1 = new RotateAnimation(0, -180, 1, 0.5f, 1, 0.5f);//中点逆时针旋转180度。		rotate2 = new RotateAnimation(-180, 0, 1, 0.5f, 1, 0.5f);		rotate1.setDuration(200);		rotate2.setDuration(200);		rotate1.setFillAfter(true);		rotate2.setFillAfter(true);	}		/**	 * 设置view的高度	 * */	public void setHeaderViewHight(int height){		if(height<0){			height=0;		}		//获得HeaderView的布局设置		LinearLayout.LayoutParams layp=(LayoutParams)linear.getLayoutParams();		layp.height=height;		//设置HeaderView的高度		linear.setLayoutParams(layp);	}
public int getSTATE() {		return STATE;	}
/**	 * 根据父容器MyListView的触摸位移	 * 设置HeaderView的显示条的状态	 * */	public void setSTATE(int sTATE) {		//显示条的3种状态		/*		 * 1,下拉状态:		 * 		显示img,隐藏进度条		 * 		判断上一个状态,如果是上拉则开始动画2,回到原始状态(触摸移动发生时,有向上移动)。		 * 2,刷新状态		 * 		隐藏img,显示进度条		 * 3,上拉状态		 * 		显示img,隐藏进度条		 * 		判断上一个状态,如果是下拉则开始动画1.		 * */		switch (sTATE) {		case DOWN://下拉状态			t1.setText("下拉刷新");						img.setVisibility(View.VISIBLE);			probar.setVisibility(View.GONE);			switch (STATE) {//某一时刻  开始动画。				case DOWN:					break;				case UP:					img.startAnimation(rotate2);//如果上一个状态是下拉,则返回原始					break;			}			break;					case UPDATA:			t1.setText("正在刷新");			img.clearAnimation();//清除动画			img.setVisibility(View.GONE);			probar.setVisibility(View.VISIBLE);			switch (STATE) {				case DOWN:					break;				case UPDATA:					break;				case UP:					break;			}			break;		case UP:			t1.setText("松开刷新");			img.setVisibility(View.VISIBLE);			probar.setVisibility(View.GONE);			switch (STATE) {				case DOWN:					img.startAnimation(rotate1);//如果上一个状态是旋转上拉动画,					break;				case UPDATA:					break;				case UP:					break;		}		break;		}		STATE = sTATE;//设置当前的状态	}
/**获得header的高度*/	public float getHeaderViewHight() {		// TODO Auto-generated method stub		return linear.getHeight();	}	public void setTime(){		Date date=new Date();		SimpleDateFormat simple=new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");		String datatime=simple.format(date);		t2.setText("刷新时间:"+datatime);	}

}

5.header_view加载布局代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:background="#ffffff"    android:gravity="center_vertical"    android:orientation="vertical" >    <RelativeLayout         android:layout_width="match_parent"        android:layout_height="75px"        android:gravity="center">        <TextView             android:id="@+id/text"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="下拉刷新"            android:textSize="17sp"            android:layout_centerHorizontal="true"            />        <TextView             android:id="@+id/text1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="时间:刚刚"            android:textSize="14sp"            android:layout_below="@id/text"            android:gravity="center"            android:layout_centerHorizontal="true"/>        <ImageView             android:id="@+id/pull"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:src="@drawable/pull_down"            android:layout_marginRight="10dip"            android:layout_toLeftOf="@id/text1"/>        <ProgressBar             android:id="@+id/progress"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginRight="10dip"            android:layout_toLeftOf="@id/text1"/>    </RelativeLayout></LinearLayout>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: