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

*********根据新浪微博随便看看实现下拉刷新功能*******

一、项目开发

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 = 0 f ;
//阻尼器
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>






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值