本例是在上例的基础上完成的。本例实现的listview上拉载入、下拉刷新功能,是在开源网站上别人写好的listview,主要是对listview的控件进行重写,添加了footer和header。
1.listview_footer
listview_footer是listview的底部。
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="wrap_content" >
5
6 <RelativeLayout
7 android:id="@+id/xlistview_footer_content"
8 android:layout_width="fill_parent"
9 android:layout_height="wrap_content"
10 android:padding="10dp" >
11
12 <ProgressBar
13 android:id="@+id/xlistview_footer_progressbar"
14 android:layout_width="wrap_content"
15 android:layout_height="wrap_content"
16 android:layout_centerInParent="true"
17 android:visibility="invisible" />
18
19 <TextView
20 android:id="@+id/xlistview_footer_hint_textview"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:layout_centerInParent="true"
24 android:text="@string/xlistview_footer_hint_normal" />
25 </RelativeLayout>
26
27 </LinearLayout>
listview_footer由ProgressBar和textview组成。用户点击textview或者上拉的时候,会触发监听事件,实现更多数据的载入。
1 public final static int STATE_NORMAL = 0;
2 public final static int STATE_READY = 1;
3 public final static int STATE_LOADING = 2;
4
5 private Context mContext;
6
7 private View mContentView;
8 private View mProgressBar;
9 private TextView mHintView;
10
11 public XListViewFooter(Context context) {
12 super(context);
13 initView(context);
14 }
15
16 public XListViewFooter(Context context, AttributeSet attrs) {
17 super(context, attrs);
18 initView(context);
19 }
20
21
22 public void setState(int state) {
23 mHintView.setVisibility(View.INVISIBLE);
24 mProgressBar.setVisibility(View.INVISIBLE);
25 mHintView.setVisibility(View.INVISIBLE);
26 if (state == STATE_READY) {
27 mHintView.setVisibility(View.VISIBLE);
28 mHintView.setText(R.string.xlistview_footer_hint_ready);
29 } else if (state == STATE_LOADING) {
30 mProgressBar.setVisibility(View.VISIBLE);
31 } else {
32 mHintView.setVisibility(View.VISIBLE);
33 mHintView.setText(R.string.xlistview_footer_hint_normal);
34 }
35 }
36
37 public void setBottomMargin(int height) {
38 if (height < 0) return ;
39 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();
40 lp.bottomMargin = height;
41 mContentView.setLayoutParams(lp);
42 }
43
44 public int getBottomMargin() {
45 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();
46 return lp.bottomMargin;
47 }
48
49 /**
50 * normal status
51 */
52 public void normal() {
53 mHintView.setVisibility(View.VISIBLE);
54 mProgressBar.setVisibility(View.GONE);
55 }
56
57
58 /**
59 * loading status
60 */
61 public void loading() {
62 mHintView.setVisibility(View.GONE);
63 mProgressBar.setVisibility(View.VISIBLE);
64 }
65
66 /**
67 * hide footer when disable pull load more
68 */
69 public void hide() {
70 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();
71 lp.height = 0;
72 mContentView.setLayoutParams(lp);
73 }
74
75 /**
76 * show footer
77 */
78 public void show() {
79 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();
80 lp.height = LayoutParams.WRAP_CONTENT;
81 mContentView.setLayoutParams(lp);
82 }
83
84 private void initView(Context context) {
85 mContext = context;
86 LinearLayout moreView = (LinearLayout)LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null);
87 addView(moreView);
88 moreView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
89
90 mContentView = moreView.findViewById(R.id.xlistview_footer_content);
91 mProgressBar = moreView.findViewById(R.id.xlistview_footer_progressbar);
92 mHintView = (TextView)moreView.findViewById(R.id.xlistview_footer_hint_textview);
93 }
后台代码定义了listview_footer的状态变化,包括加载、停止加载等,实现了对事件的监听。
2.listview_header
listview_header是listview显示的时候头部文件。用户下拉的时候,实现数据的重新载入。
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="wrap_content"
5 android:gravity="bottom" >
6
7 <RelativeLayout
8 android:id="@+id/xlistview_header_content"
9 android:layout_width="fill_parent"
10 android:layout_height="60dp" >
11
12 <LinearLayout
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 android:layout_centerInParent="true"
16 android:gravity="center"
17 android:orientation="vertical" android:id="@+id/xlistview_header_text">
18
19 <TextView
20 android:id="@+id/xlistview_header_hint_textview"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:text="@string/xlistview_header_hint_normal" />
24
25 <LinearLayout
26 android:layout_width="wrap_content"
27 android:layout_height="wrap_content"
28 android:layout_marginTop="3dp" >
29
30 <TextView
31 android:layout_width="wrap_content"
32 android:layout_height="wrap_content"
33 android:text="@string/xlistview_header_last_time"
34 android:textSize="12sp" />
35
36 <TextView
37 android:id="@+id/xlistview_header_time"
38 android:layout_width="wrap_content"
39 android:layout_height="wrap_content"
40 android:textSize="12sp" />
41 </LinearLayout>
42 </LinearLayout>
43
44 <ImageView
45 android:id="@+id/xlistview_header_arrow"
46 android:layout_width="wrap_content"
47 android:layout_height="wrap_content"
48 android:layout_alignLeft="@id/xlistview_header_text"
49 android:layout_centerVertical="true"
50 android:layout_marginLeft="-35dp"
51 android:src="@drawable/xlistview_arrow" />
52
53 <ProgressBar
54 android:id="@+id/xlistview_header_progressbar"
55 android:layout_width="30dp"
56 android:layout_height="30dp"
57 android:layout_alignLeft="@id/xlistview_header_text"
58 android:layout_centerVertical="true"
59 android:layout_marginLeft="-40dp"
60 android:visibility="invisible" />
61 </RelativeLayout>
62
63 </LinearLayout>
xml部分由textview和imageview组成。
1 private LinearLayout mContainer;
2 private ImageView mArrowImageView;
3 private ProgressBar mProgressBar;
4 private TextView mHintTextView;
5 private int mState = STATE_NORMAL;
6
7 private Animation mRotateUpAnim;
8 private Animation mRotateDownAnim;
9
10 private final int ROTATE_ANIM_DURATION = 180;
11
12 public final static int STATE_NORMAL = 0;
13 public final static int STATE_READY = 1;
14 public final static int STATE_REFRESHING = 2;
15
16 public XListViewHeader(Context context) {
17 super(context);
18 initView(context);
19 }
20
21 /**
22 * @param context
23 * @param attrs
24 */
25 public XListViewHeader(Context context, AttributeSet attrs) {
26 super(context, attrs);
27 initView(context);
28 }
29
30 private void initView(Context context) {
31 // 鍒濆鎯呭喌锛岃缃笅鎷夊埛鏂皏iew楂樺害涓?
32 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
33 LayoutParams.FILL_PARENT, 0);
34 mContainer = (LinearLayout) LayoutInflater.from(context).inflate(
35 R.layout.xlistview_header, null);
36 addView(mContainer, lp);
37 setGravity(Gravity.BOTTOM);
38
39 mArrowImageView = (ImageView)findViewById(R.id.xlistview_header_arrow);
40 mHintTextView = (TextView)findViewById(R.id.xlistview_header_hint_textview);
41 mProgressBar = (ProgressBar)findViewById(R.id.xlistview_header_progressbar);
42
43 mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
44 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
45 0.5f);
46 mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
47 mRotateUpAnim.setFillAfter(true);
48 mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
49 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
50 0.5f);
51 mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);
52 mRotateDownAnim.setFillAfter(true);
53 }
54
55 public void setState(int state) {
56 if (state == mState) return ;
57
58 if (state == STATE_REFRESHING) { // 鏄剧ず杩涘害
59 mArrowImageView.clearAnimation();
60 mArrowImageView.setVisibility(View.INVISIBLE);
61 mProgressBar.setVisibility(View.VISIBLE);
62 } else { // 鏄剧ず绠ご鍥剧墖
63 mArrowImageView.setVisibility(View.VISIBLE);
64 mProgressBar.setVisibility(View.INVISIBLE);
65 }
66
67 switch(state){
68 case STATE_NORMAL:
69 if (mState == STATE_READY) {
70 mArrowImageView.startAnimation(mRotateDownAnim);
71 }
72 if (mState == STATE_REFRESHING) {
73 mArrowImageView.clearAnimation();
74 }
75 mHintTextView.setText(R.string.xlistview_header_hint_normal);
76 break;
77 case STATE_READY:
78 if (mState != STATE_READY) {
79 mArrowImageView.clearAnimation();
80 mArrowImageView.startAnimation(mRotateUpAnim);
81 mHintTextView.setText(R.string.xlistview_header_hint_ready);
82 }
83 break;
84 case STATE_REFRESHING:
85 mHintTextView.setText(R.string.xlistview_header_hint_loading);
86 break;
87 default:
88 }
89
90 mState = state;
91 }
92
93 public void setVisiableHeight(int height) {
94 if (height < 0)
95 height = 0;
96 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContainer
97 .getLayoutParams();
98 lp.height = height;
99 mContainer.setLayoutParams(lp);
100 }
101
102 public int getVisiableHeight() {
103 return mContainer.getHeight();
104 }
后台通过状态的改变,控制header的高度。
3.xlistview
xlistview是对listview控件的重写
1 public class XListView extends ListView implements OnScrollListener {
2
3 private float mLastY = -1; // save event y
4 private Scroller mScroller; // used for scroll back
5 private OnScrollListener mScrollListener; // user's scroll listener
6
7 // the interface to trigger refresh and load more.
8 private IXListViewListener mListViewListener;
9
10 // -- header view
11 private XListViewHeader mHeaderView;
12 // header view content, use it to calculate the Header's height. And hide it
13 // when disable pull refresh.
14 private RelativeLayout mHeaderViewContent;
15 private TextView mHeaderTimeView;
16 private int mHeaderViewHeight; // header view's height
17 private boolean mEnablePullRefresh = true;
18 private boolean mPullRefreshing = false; // is refreashing.
19
20 // -- footer view
21 private XListViewFooter mFooterView;
22 private boolean mEnablePullLoad;
23 private boolean mPullLoading;
24 private boolean mIsFooterReady = false;
25
26 // total list items, used to detect is at the bottom of listview.
27 private int mTotalItemCount;
28
29 // for mScroller, scroll back from header or footer.
30 private int mScrollBack;
31 private final static int SCROLLBACK_HEADER = 0;
32 private final static int SCROLLBACK_FOOTER = 1;
33
34 private final static int SCROLL_DURATION = 400; // scroll back duration
35 private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px
36 // at bottom, trigger
37 // load more.
38 private final static float OFFSET_RADIO = 1.8f; // support iOS like pull
39 // feature.
40
41 /**
42 * @param context
43 */
44 public XListView(Context context) {
45 super(context);
46 initWithContext(context);
47 }
48
49 public XListView(Context context, AttributeSet attrs) {
50 super(context, attrs);
51 initWithContext(context);
52 }
53
54 public XListView(Context context, AttributeSet attrs, int defStyle) {
55 super(context, attrs, defStyle);
56 initWithContext(context);
57 }
58
59 private void initWithContext(Context context) {
60 mScroller = new Scroller(context, new DecelerateInterpolator());
61 // XListView need the scroll event, and it will dispatch the event to
62 // user's listener (as a proxy).
63 super.setOnScrollListener(this);
64
65 // init header view
66 mHeaderView = new XListViewHeader(context);
67 mHeaderViewContent = (RelativeLayout) mHeaderView
68 .findViewById(R.id.xlistview_header_content);
69 mHeaderTimeView = (TextView) mHeaderView
70 .findViewById(R.id.xlistview_header_time);
71 addHeaderView(mHeaderView);
72
73 // init footer view
74 mFooterView = new XListViewFooter(context);
75
76 // init header height
77 mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
78 new OnGlobalLayoutListener() {
79 @SuppressWarnings("deprecation")
80 @Override
81 public void onGlobalLayout() {
82 mHeaderViewHeight = mHeaderViewContent.getHeight();
83 getViewTreeObserver()
84 .removeGlobalOnLayoutListener(this);
85 }
86 });
87 }
88
89 @Override
90 public void setAdapter(ListAdapter adapter) {
91 // make sure XListViewFooter is the last footer view, and only add once.
92 if (mIsFooterReady == false) {
93 mIsFooterReady = true;
94 addFooterView(mFooterView);
95 }
96 super.setAdapter(adapter);
97 }
98
99 /**
100 * enable or disable pull down refresh feature.
101 *
102 * @param enable
103 */
104 public void setPullRefreshEnable(boolean enable) {
105 mEnablePullRefresh = enable;
106 if (!mEnablePullRefresh) { // disable, hide the content
107 mHeaderViewContent.setVisibility(View.INVISIBLE);
108 } else {
109 mHeaderViewContent.setVisibility(View.VISIBLE);
110 }
111 }
112
113 /**
114 * enable or disable pull up load more feature.
115 *
116 * @param enable
117 */
118 public void setPullLoadEnable(boolean enable) {
119 mEnablePullLoad = enable;
120 if (!mEnablePullLoad) {
121 mFooterView.hide();
122 mFooterView.setOnClickListener(null);
123 } else {
124 mPullLoading = false;
125 mFooterView.show();
126 mFooterView.setState(XListViewFooter.STATE_NORMAL);
127 // both "pull up" and "click" will invoke load more.
128 mFooterView.setOnClickListener(new OnClickListener() {
129 @Override
130 public void onClick(View v) {
131 startLoadMore();
132 }
133 });
134 }
135 }
136
137 /**
138 * stop refresh, reset header view.
139 */
140 public void stopRefresh() {
141 if (mPullRefreshing == true) {
142 mPullRefreshing = false;
143 resetHeaderHeight();
144 }
145 }
146
147 /**
148 * stop load more, reset footer view.
149 */
150 public void stopLoadMore() {
151 if (mPullLoading == true) {
152 mPullLoading = false;
153 mFooterView.setState(XListViewFooter.STATE_NORMAL);
154 }
155 }
156
157 /**
158 * set last refresh time
159 *
160 * @param time
161 */
162 public void setRefreshTime(String time) {
163 mHeaderTimeView.setText(time);
164 }
165
166 private void invokeOnScrolling() {
167 if (mScrollListener instanceof OnXScrollListener) {
168 OnXScrollListener l = (OnXScrollListener) mScrollListener;
169 l.onXScrolling(this);
170 }
171 }
172
173 private void updateHeaderHeight(float delta) {
174 mHeaderView.setVisiableHeight((int) delta
175 + mHeaderView.getVisiableHeight());
176 if (mEnablePullRefresh && !mPullRefreshing) { // 鏈浜庡埛鏂扮姸鎬侊紝鏇存柊绠ご
177 if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
178 mHeaderView.setState(XListViewHeader.STATE_READY);
179 } else {
180 mHeaderView.setState(XListViewHeader.STATE_NORMAL);
181 }
182 }
183 setSelection(0); // scroll to top each time
184 }
185
186 /**
187 * reset header view's height.
188 */
189 private void resetHeaderHeight() {
190 int height = mHeaderView.getVisiableHeight();
191 if (height == 0) // not visible.
192 return;
193 // refreshing and header isn't shown fully. do nothing.
194 if (mPullRefreshing && height <= mHeaderViewHeight) {
195 return;
196 }
197 int finalHeight = 0; // default: scroll back to dismiss header.
198 // is refreshing, just scroll back to show all the header.
199 if (mPullRefreshing && height > mHeaderViewHeight) {
200 finalHeight = mHeaderViewHeight;
201 }
202 mScrollBack = SCROLLBACK_HEADER;
203 mScroller.startScroll(0, height, 0, finalHeight - height,
204 SCROLL_DURATION);
205 // trigger computeScroll
206 invalidate();
207 }
208
209 private void updateFooterHeight(float delta) {
210 int height = mFooterView.getBottomMargin() + (int) delta;
211 if (mEnablePullLoad && !mPullLoading) {
212 if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load
213 // more.
214 mFooterView.setState(XListViewFooter.STATE_READY);
215 } else {
216 mFooterView.setState(XListViewFooter.STATE_NORMAL);
217 }
218 }
219 mFooterView.setBottomMargin(height);
220
221 // setSelection(mTotalItemCount - 1); // scroll to bottom
222 }
223
224 private void resetFooterHeight() {
225 int bottomMargin = mFooterView.getBottomMargin();
226 if (bottomMargin > 0) {
227 mScrollBack = SCROLLBACK_FOOTER;
228 mScroller.startScroll(0, bottomMargin, 0, -bottomMargin,
229 SCROLL_DURATION);
230 invalidate();
231 }
232 }
233
234 private void startLoadMore() {
235 mPullLoading = true;
236 mFooterView.setState(XListViewFooter.STATE_LOADING);
237 if (mListViewListener != null) {
238 mListViewListener.onLoadMore();
239 }
240 }
241
242 @Override
243 public boolean onTouchEvent(MotionEvent ev) {
244 if (mLastY == -1) {
245 mLastY = ev.getRawY();
246 }
247
248 switch (ev.getAction()) {
249 case MotionEvent.ACTION_DOWN:
250 mLastY = ev.getRawY();
251 break;
252 case MotionEvent.ACTION_MOVE:
253 final float deltaY = ev.getRawY() - mLastY;
254 mLastY = ev.getRawY();
255 System.out.println(getFirstVisiblePosition() + "---->"
256 + getLastVisiblePosition());
257 if (getFirstVisiblePosition() == 0
258 && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {
259 // the first item is showing, header has shown or pull down.
260 updateHeaderHeight(deltaY / OFFSET_RADIO);
261 invokeOnScrolling();
262 } else if (getLastVisiblePosition() == mTotalItemCount - 1
263 && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
264 // last item, already pulled up or want to pull up.
265 updateFooterHeight(-deltaY / OFFSET_RADIO);
266 }
267 break;
268 default:
269 mLastY = -1; // reset
270 if (getFirstVisiblePosition() == 0) {
271 // invoke refresh
272 if (mEnablePullRefresh
273 && mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
274 mPullRefreshing = true;
275 mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
276 if (mListViewListener != null) {
277 mListViewListener.onRefresh();
278 }
279 }
280 resetHeaderHeight();
281 }
282 if (getLastVisiblePosition() == mTotalItemCount - 1) {
283 // invoke load more.
284 if (mEnablePullLoad
285 && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {
286 startLoadMore();
287 }
288 resetFooterHeight();
289 }
290 break;
291 }
292 return super.onTouchEvent(ev);
293 }
294
295 @Override
296 public void computeScroll() {
297 if (mScroller.computeScrollOffset()) {
298 if (mScrollBack == SCROLLBACK_HEADER) {
299 mHeaderView.setVisiableHeight(mScroller.getCurrY());
300 } else {
301 mFooterView.setBottomMargin(mScroller.getCurrY());
302 }
303 postInvalidate();
304 invokeOnScrolling();
305 }
306 super.computeScroll();
307 }
308
309 @Override
310 public void setOnScrollListener(OnScrollListener l) {
311 mScrollListener = l;
312 }
313
314 @Override
315 public void onScrollStateChanged(AbsListView view, int scrollState) {
316 if (mScrollListener != null) {
317 mScrollListener.onScrollStateChanged(view, scrollState);
318 }
319 }
320
321 @Override
322 public void onScroll(AbsListView view, int firstVisibleItem,
323 int visibleItemCount, int totalItemCount) {
324 // send to user's listener
325 mTotalItemCount = totalItemCount;
326 if (mScrollListener != null) {
327 mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,
328 totalItemCount);
329 }
330 }
331
332 public void setXListViewListener(IXListViewListener l) {
333 mListViewListener = l;
334 }
335
336 /**
337 * you can listen ListView.OnScrollListener or this one. it will invoke
338 * onXScrolling when header/footer scroll back.
339 */
340 public interface OnXScrollListener extends OnScrollListener {
341 public void onXScrolling(View view);
342 }
343
344 /**
345 * implements this interface to get refresh/load more event.
346 */
347 public interface IXListViewListener {
348 public void onRefresh();
349
350 public void onLoadMore();
351 }
352 }
在xlistview中定义了一个事件接口,来监听加载和刷新。
4.mainactivity
1 protected void onCreate(Bundle savedInstanceState) {
2 super.onCreate(savedInstanceState);
3 setContentView(R.layout.activity_main);
4 handler=new Handler();
5 sqlhelper=new SQLiteHelper(MainActivity.this, "test", null, 1);
6 list=new ArrayList<PersonInfo>();
7 getData();
8 listview=(XListView)findViewById(R.id.listView1);
9 registerForContextMenu(listview);
10 listview.setPullLoadEnable(true);
11 // View moreview=getLayoutInflater().inflate(R.layout.moredata, null);
12 //listview.addFooterView(moreview);
13 adapter=new MyAdapter(this);
14 listview.setAdapter(adapter);
15 listview.setXListViewListener(this);
16 listview.setOnItemLongClickListener(new OnItemLongClickListener() {
17 @Override
18 public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
19 int arg2, long arg3) {
20 // TODO Auto-generated method stub
21 PersonInfo person=list.get(arg2);
22 delname=person.getName();
23 return false;
24 }
25 });
26
27 /* btnpro=(Button)moreview.findViewById(R.id.bt_load);
28 pg=(ProgressBar)moreview.findViewById(R.id.pg);
29 btnpro.setOnClickListener(new View.OnClickListener() {
30
31 @Override
32 public void onClick(View v) {
33 // TODO Auto-generated method stub
34 pg.setVisibility(View.VISIBLE);// 将进度条可见
35 btnpro.setVisibility(View.GONE);// 按钮不可见
36 Handler hanldre=new Handler();
37 hanldre.postDelayed(new Runnable(){
38
39 @Override
40 public void run() {
41 // TODO Auto-generated method stub
42
43 adapter.count+=5;
44
45 btnpro.setVisibility(View.VISIBLE);
46 pg.setVisibility(View.GONE);
47 if(adapter.count>list.size())
48
49 {
50 adapter. count=list.size();
51 btnpro.setVisibility(View.INVISIBLE);
52 }
53 adapter.notifyDataSetChanged();
54 }}, 2000);
55 }
56 });*/
57
58 }
59 private void getData()
60 {
61 Cursor cur=sqlhelper.getReadableDatabase().query("person", null, null, null, null, null, null);
62 if(cur.moveToFirst())
63 {
64 while(cur.moveToNext())
65 {
66 PersonInfo person=new PersonInfo();
67 person.name=cur.getString(cur.getColumnIndex("name"));
68 person.age=cur.getInt(cur.getColumnIndex("age"));
69 list.add(person);
70 }
71 }
72 }
73 private void onLoad() {
74 listview.stopRefresh();
75 listview.stopLoadMore();
76 SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
77 String strTime = timeFormat.format(new java.util.Date());
78 listview.setRefreshTime(strTime);
79 }
1 @Override
2 public void onRefresh() {
3 // TODO Auto-generated method stub
4 handler.postDelayed(new Runnable(){
5
6 @Override
7 public void run() {
8 // TODO Auto-generated method stub
9 if(list!=null &&list.size()>0)
10 {
11 list.clear();
12 getData();
13 adapter.notifyDataSetChanged();
14 onLoad();
15 }
16 }}, 2000);
17 }
18 @Override
19 public void onLoadMore() {
20 // TODO Auto-generated method stub
21
22 handler.postDelayed(new Runnable(){
23
24 @Override
25 public void run() {
26 // TODO Auto-generated method stub
27 adapter.count+=5;
28
29 if(adapter.count>list.size())
30
31 {
32 adapter. count=list.size();
33 }
34 adapter.notifyDataSetChanged();
35 onLoad();
36 }}, 2000);
37 }
刷新和加载都是新建了一个handler。在handler中执行。
5.demo