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

本例是在上例的基础上完成的。本例实现的listview上拉载入、下拉刷新功能,是在开源网站上别人写好的listview,主要是对listview的控件进行重写,添加了footer和header。

1.listview_footer

listview_footer是listview的底部。

Android学习之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>
lsitview_footer

listview_footer由ProgressBar和textview组成。用户点击textview或者上拉的时候,会触发监听事件,实现更多数据的载入。

Android学习之listview的下拉刷新、上拉载入
 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

后台代码定义了listview_footer的状态变化,包括加载、停止加载等,实现了对事件的监听。

2.listview_header

listview_header是listview显示的时候头部文件。用户下拉的时候,实现数据的重新载入。

Android学习之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>
listview_header

xml部分由textview和imageview组成。

Android学习之listview的下拉刷新、上拉载入
  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控件的重写

Android学习之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

在xlistview中定义了一个事件接口,来监听加载和刷新。

4.mainactivity

Android学习之listview的下拉刷新、上拉载入
 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     }
oncreate
Android学习之listview的下拉刷新、上拉载入
 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     }
onloadmore

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

5.demo

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

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

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

 

Android学习之listview的下拉刷新、上拉载入,布布扣,bubuko.com

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

上一篇:在Ubuntu 12.04 64 位 搭载Android4.4源码编译环境


下一篇:Android:实现退出确认对话框