如图可看出下拉状态分为四个
0 正常状态
1 下拉可以刷新状态
2 松开可以刷新状态
3 正在加载状态
首先自己自定义1个listview,在listview加入头布局
head.xml
<?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="match_parent"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="right">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
</LinearLayout>
package com.example.a;
import java.util.zip.Inflater;
import android.R.bool;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class Mylist extends ListView {
View view;
int height;//图片高度
int firth;//当面listview可见区域的第1个item号
int starty;//按下触摸的第1个坐标y;
boolean isin;//是否在页面最顶端按下触摸
boolean isload;//是否正在加载
int sta;
Iload iload;//接口,提供需要加载的数据
public Mylist(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
height=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher).getHeight();
init(context);
setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
firth=arg1;
}
});
}
void init(Context context){
view=LayoutInflater.from(context).inflate(R.layout.head, null);
Top(0-height);//通过设置上边距来隐藏listview的头布局
addHeaderView(view);
}
void Top(int top){
view.setPadding(0, top, 0, 0);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
Log.i("nima","onTouchEvent");
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("nima",""+firth);
//判断当面页面是否在最顶端和页面是否正在刷新
if(firth==0&&!isload){
starty=(int) ev.getY();
isin=true;
}
break;
case MotionEvent.ACTION_MOVE:
if(isin){
move(ev);
caozuo();
}
break;
case MotionEvent.ACTION_UP:
if(isin){
up();
caozuo();
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
@SuppressLint("NewApi")
void move(MotionEvent ev){
//通过下拉的距离y改变4个状态
int y=(int) ev.getY()-starty;
switch (sta) {
case 0:
if(y>0)
sta=1;
break;
case 1:
if(y>height+30)
sta=2;
break;
case 2:
if(y<height+30)
sta=1;
if(y<=0)
sta=0;
break;
default:
break;
}
Log.i("yy"," "+y);
Top(y-height);
}
//当触摸结束时各个状态对应的行为且重新初始化
void up(){
Log.i("nima","up"+sta);
switch (sta) {
case 1:
sta=0;
Top(0-height);
break;
case 2:
sta=3;
Top(0);
break;
default:
break;
}
isin=false;
}
//4个状态对应的头布局的操作
void caozuo(){
ImageView imageView=(ImageView) view.findViewById(R.id.imageView1);
ProgressBar bar= (ProgressBar) view.findViewById(R.id.progressBar1);
TextView textView1= (TextView) view.findViewById(R.id.textView1);
TextView textView2= (TextView) view.findViewById(R.id.textView2);
switch (sta) {
case 0:
imageView.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);
break;
case 1:
imageView.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);
textView1.setText("下拉可以刷新");
break;
case 2:
imageView.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);
textView1.setText("松开可以刷新");
break;
case 3:
isload=true;
imageView.setVisibility(View.GONE);
bar.setVisibility(View.VISIBLE);
textView1.setText("正在加载");
Handler handler=new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
iload.onload();
sta=0;//加载完之后重新初始化
Top(0-height);
isload=false;
}
}, 2000);
break;
default:
break;
}
}
void Setonload(Iload iload){
this.iload=iload;
}
interface Iload{
void onload();
}
}