首页 > 代码库 > Android学习之listview的下拉刷新、上拉载入

Android学习之listview的下拉刷新、上拉载入

本例是在上例的基础上完成的。本例实现的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         <ProgressBar13             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         <TextView20             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>
lsitview_footer

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 status51      */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 more68      */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 footer77      */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

后台代码定义了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         <LinearLayout13             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             <TextView20                 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             <LinearLayout26                 android:layout_width="wrap_content"27                 android:layout_height="wrap_content"28                 android:layout_marginTop="3dp" >29 30                 <TextView31                     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                 <TextView37                     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         <ImageView45             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         <ProgressBar54             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>
listview_header

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     }
listview_header

后台通过状态的改变,控制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 enable103      */104     public void setPullRefreshEnable(boolean enable) {105         mEnablePullRefresh = enable;106         if (!mEnablePullRefresh) { // disable, hide the content107             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 enable117      */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                 @Override130                 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 time159      * 160      * @param time161      */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) delta175                 + 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 time184     }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 computeScroll206         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 load213                                                     // 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 bottom222     }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     @Override243     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() == 0258                     && (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 - 1263                     && (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; // reset270             if (getFirstVisiblePosition() == 0) {271                 // invoke refresh272                 if (mEnablePullRefresh273                         && 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 (mEnablePullLoad285                         && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {286                     startLoadMore();287                 }288                 resetFooterHeight();289             }290             break;291         }292         return super.onTouchEvent(ev);293     }294 295     @Override296     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     @Override310     public void setOnScrollListener(OnScrollListener l) {311         mScrollListener = l;312     }313 314     @Override315     public void onScrollStateChanged(AbsListView view, int scrollState) {316         if (mScrollListener != null) {317             mScrollListener.onScrollStateChanged(view, scrollState);318         }319     }320 321     @Override322     public void onScroll(AbsListView view, int firstVisibleItem,323             int visibleItemCount, int totalItemCount) {324         // send to user‘s listener325         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 invoke338      * 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 onl oadMore();351     }352 }
xlistview

在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             @Override18             public boolean onItemLongClick(AdapterView<?> arg0, View arg1,19                     int arg2, long arg3) {20                 // TODO Auto-generated method stub21                 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             @Override32             public void onClick(View v) {33                 // TODO Auto-generated method stub34                 pg.setVisibility(View.VISIBLE);// 将进度条可见35                    btnpro.setVisibility(View.GONE);// 按钮不可见36                     Handler hanldre=new Handler();37                     hanldre.postDelayed(new Runnable(){38 39                         @Override40                         public void run() {41                             // TODO Auto-generated method stub42                             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 onl oad() {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     }
oncreate
 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                     onl oad();15                 }16             }}, 2000);17     }18     @Override19     public void onl oadMore() {20         // TODO Auto-generated method stub21 22         handler.postDelayed(new Runnable(){23 24             @Override25             public void run() {26                 // TODO Auto-generated method stub27                 adapter.count+=5;28                 29                    if(adapter.count>list.size())30                        31                    {32                        adapter. count=list.size();33                    }34                     adapter.notifyDataSetChanged();35                     onl oad();36             }}, 2000);37     }
onloadmore

刷新和加载都是新建了一个handler。在handler中执行。

5.demo