主要有四个状态;继承listivw;按下的状态;滑动的状态;松开的状态;开始默认状态;
package com.example.customview1406_mylistview;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MyListView extends ListView {
View viewHead;
int viewHeight;
final static int DONE = 1;
final static int PULL = 2;
final static int REALEASE = 3;
final static int REFRESHING = 4;
int currentState = -1;
int downY = 0;
TextView tvState, tvUpdateTime;
ImageView ivArror;
ProgressBar progressBar;
OnRefreshingListener onRefreshingListener;
public void setOnRefreshingListener(
OnRefreshingListener onRefreshingListener) {
this.onRefreshingListener = onRefreshingListener;
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
try {
currentState = DONE;
viewHead = View.inflate(context, R.layout.listview_header, null);
tvState = (TextView) viewHead.findViewById(R.id.tv_state);
tvUpdateTime = (TextView) viewHead.findViewById(R.id.tv_updateTime);
ivArror = (ImageView) viewHead.findViewById(R.id.iv_arrow);
progressBar = (ProgressBar) viewHead.findViewById(R.id.progressBar);
// 测量
viewHead.measure(0, 0);
viewHeight = viewHead.getMeasuredHeight();
this.addHeaderView(viewHead);
viewHead.setPadding(0, -viewHeight, 0, 0);
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
if (currentState == DONE) {
downY = (int) ev.getY();
currentState = PULL;
}
break;
case MotionEvent.ACTION_MOVE:
if (currentState == PULL) {
int currentY = (int) ev.getY();
int moveY = currentY - downY;
int top = moveY + -viewHeight;
viewHead.setPadding(0, top, 0, 0);
if (moveY > viewHeight) {
this.currentState = REALEASE;
this.tvState.setText("松开刷新");
}
}
break;
case MotionEvent.ACTION_UP:
if (this.currentState == REALEASE) {
// 刷新中
this.currentState = REFRESHING;
this.tvState.setText("刷新中");
this.ivArror.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
if (onRefreshingListener != null) {
onRefreshingListener.onRefresh();
}
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
interface OnRefreshingListener {
public void onRefresh();
}
public void completeRefresh() {
// TODO Auto-generated method stub
viewHead.setPadding(0, -viewHeight, 0, 0);
this.currentState = DONE;
}
}
java activity;代码
package com.example.customview1406_mylistview;
import java.util.ArrayList;
import com.example.customview1406_mylistview.MyListView.OnRefreshingListener;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
MyListView myListView;
MyListViewAdapter myListViewAdapter;
ArrayList<String> list = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListView = (MyListView) findViewById(R.id.myListView);
list.add("java");
list.add("android");
myListViewAdapter = new MyListViewAdapter(this, list);
myListView.setAdapter(myListViewAdapter);
myListView.setOnRefreshingListener(new OnRefreshingListener() {
@Override
public void onRefresh() {
new Thread() {
public void run() {
try {
this.sleep(2000);
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
list.add("联网得到的数据");
myListViewAdapter
.notifyDataSetChanged();
myListView.completeRefresh();
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}