*********根据新浪微博随便看看实现下拉刷新功能*******
一、项目开发
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 () {@Overridepublic boolean handleMessage ( Message arg0 ) {// TODO Auto-generated method stubif ( arg0 . what == 0 ){//结束刷新mylistview . endOnRersh ();}return false ;}});
class OnRershListener implements OnRersh {//实现刷新接口的 方法,,在MyList中会回调该方法。//模拟@Overridepublic void OnRershListener () {// TODO Auto-generated method stubnew Thread ( new Run ()). start (); //启动一个线程}
|
public class MyListView extends ListView {private HeaderView head_view = null ;//起始的y坐标private float pageY = 0 f ;//阻尼器private float DAMPER = 1.25f ;private OnRersh onRershListener = null ;public MyListView ( Context context , AttributeSet attrs ) {super ( context , attrs );// TODO Auto-generated constructor stubinitView ( context );}private void initView ( Context context ) {// TODO Auto-generated method stubhead_view = new HeaderView ( context );this . addHeaderView ( head_view );}//触摸事件方法,发生屏幕按下、抬起、滑动,程序都回调该方法@Overridepublic 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 ://下拉显示状态,不刷新,高度0setHeaderViewHight (- head_view . getHeaderViewHight ());break ;case HeaderView . UPDATA ://刷新状态break ;case HeaderView . UP ://开始刷新setHeaderViewHight ( 75 - head_view . getHeaderViewHight ()); //设置HeaderView的高为75head_view . setSTATE ( HeaderView . UPDATA );head_view . setTime ();//调用刷新接口if ( onRershListener != null ){onRershListener . OnRershListener ();}break ;}break ;}return super . onTouchEvent ( ev );}
|
}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 stubreturn 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加载布局代码
|