首页 > 代码库 > 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>
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的状态变化,包括加载、停止加载等,实现了对事件的监听。
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>
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 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中定义了一个事件接口,来监听加载和刷新。
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 }
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 }
刷新和加载都是新建了一个handler。在handler中执行。
5.demo
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。