ListView实现下拉刷新加载更多的实例代码(直接拿来用)
ListViewApibixu好好看看
mNewsAdapter.notifyDataSetChanged();//刷新ListView
自定义的RefreashListView
packagecom.itguang.dell_pc.myapplication.view; importandroid.content.Context; importandroid.util.AttributeSet; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.animation.Animation; importandroid.view.animation.RotateAnimation; importandroid.widget.AbsListView; importandroid.widget.ImageView; importandroid.widget.ListView; importandroid.widget.ProgressBar; importandroid.widget.TextView; importcom.itguang.dell_pc.myapplication.R; importjava.text.SimpleDateFormat; importjava.util.Date; /** *作者:小光哥on2016/7/7. *邮箱:1445037803@qq.com *修订历史: *描述: *┏┓┏┓ *┏┛┻━━━┛┻┓━━━━┻┓ *┃┃ *┃━┃ *┃><┃ *┃┃ *┃...⌒...┃ *┃┃ *┗━┓┏━┛ *┃┃Codeisfarawayfrombugwiththeanimalprotecting *┃史┃神兽保佑,代码无bug *┃诗┃ *┃之┃ *┃宠┃ *┃┃ *┃┗━━━┓ *┃BUG天敌┣┓┣┓┣┓┣┓┣┓ *┃┏┛ *┗┓┓┏━┳┓┏┛ *┃┫┫┃┫┫ *┗┻┛┗┻┛ */ publicclassRefreshListViewextendsListViewimplementsAbsListView.OnScrollListener{ privatestaticfinalintSTATE_PULL_REFRESH=0;//下拉刷新 privatestaticfinalintSTATE_RELEASE_REFRESH=1;//松开刷新 privatestaticfinalintSTATE_REFRESHING=2;//正在刷新 privateintmCurrrentState=STATE_PULL_REFRESH;//当前状态 privateViewmHeaderView; privateTextViewtvTitle; privateTextViewtvTime; privateProgressBarpbProgress; privateImageViewivArrow; privateRotateAnimationanimUp; privateRotateAnimationanimDown; privateintstartY=-1;//滑动起点的y坐标 privateintendY; privateintmeasuredHeight; privateintmFooterViewHeight; privateViewfooterView; publicRefreshListView(Contextcontext){ super(context); initHeaderView(); initFooterView(); } publicRefreshListView(Contextcontext,AttributeSetattrs){ super(context,attrs); initHeaderView(); initFooterView(); } publicRefreshListView(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); initHeaderView(); initFooterView(); } /** *初始化头布局 */ privatevoidinitHeaderView(){ mHeaderView=View.inflate(getContext(),R.layout.refeeash_header,null); this.addHeaderView(mHeaderView); tvTitle=(TextView)mHeaderView.findViewById(R.id.tv_title); tvTime=(TextView)mHeaderView.findViewById(R.id.tv_time); pbProgress=(ProgressBar)mHeaderView.findViewById(R.id.pb_progress); ivArrow=(ImageView)mHeaderView.findViewById(R.id.iv_arr); mHeaderView.measure(0,0);//先测量再拿到它的高度 measuredHeight=mHeaderView.getMeasuredHeight(); mHeaderView.setPadding(0,-measuredHeight,0,0); initArrowAnim(); tvTime.setText("最后刷新时间:"+getCurrentTime()); } /** *初始化脚布局 */ publicvoidinitFooterView(){ footerView=View.inflate(getContext(),R.layout.refreash_listview_footer,null); this.addFooterView(footerView); footerView.measure(0,0); mFooterViewHeight=footerView.getMeasuredHeight(); footerView.setPadding(0,-mFooterViewHeight,0,0);//默认隐藏脚布局 this.setOnScrollListener(this); } privatebooleanisLoadingMOre; @Override publicvoidonScrollStateChanged(AbsListViewview,intscrollState){ if(scrollState==SCROLL_STATE_FLING||scrollState==SCROLL_STATE_IDLE){ if(getLastVisiblePosition()==getCount()-1&&!isLoadingMOre){//滑倒最后 System.out.println("到底了......"); footerView.setPadding(0,0,0,0); setSelection(getCount()-1);//改变ListView的显示位置 isLoadingMOre=true; if(mListener!=null){ mListener.onLoadMore(); } } } } @Override publicvoidonScroll(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){ } @Override publicbooleanonTouchEvent(MotionEventev){ switch(ev.getAction()){ caseMotionEvent.ACTION_DOWN: startY=(int)ev.getRawY(); break; caseMotionEvent.ACTION_MOVE: if(startY==-1){//有时候不会响应MotionEvent.ACTION_DOWN事件,这是要重新获取startY坐标 startY=(int)ev.getRawY(); } //当正在刷新的时候,跳出循环,不再执行下面逻辑 if(mCurrrentState==STATE_RELEASE_REFRESH){ break; } endY=(int)ev.getRawY(); intdy=endY-startY;//计算手指滑动距离 if(dy>0&&getFirstVisiblePosition()==0){//只有下拉并且当前是第一个item,才允许下拉 intpadding=dy-measuredHeight;//计算padding mHeaderView.setPadding(0,padding,0,0);//设置当前padding if(padding>0&&mCurrrentState!=STATE_RELEASE_REFRESH){ mCurrrentState=STATE_RELEASE_REFRESH; refreshState(); }elseif(padding<0&&mCurrrentState!=STATE_PULL_REFRESH){//改为下拉刷新状态 mCurrrentState=STATE_PULL_REFRESH; refreshState(); } returntrue; } break; caseMotionEvent.ACTION_UP: startY=-1;//手指抬起重置 //当状态是松开刷新时抬起了手指,正在刷新 if(mCurrrentState==STATE_RELEASE_REFRESH){ mCurrrentState=STATE_REFRESHING;//正在刷新 mHeaderView.setPadding(0,0,0,0);//显示 refreshState(); }elseif(mCurrrentState==STATE_PULL_REFRESH){ mHeaderView.setPadding(0,-measuredHeight,0,0);//隐藏 } break; default: break; } returnsuper.onTouchEvent(ev); } privateStringgetCurrentTime(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringcurrentTime=format.format(newDate()); returncurrentTime; } privatevoidinitArrowAnim(){ //初始化箭头动画 animUp=newRotateAnimation(0,-180,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); animUp.setDuration(500); animUp.setFillAfter(true);//保持状态 //箭头向下动画 animDown=newRotateAnimation(-180,0,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); animDown.setDuration(500); animDown.setFillAfter(true); } /** *刷新下拉控件的布局 */ privatevoidrefreshState(){ switch(mCurrrentState){ caseSTATE_PULL_REFRESH: tvTitle.setText("下拉刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); ivArrow.startAnimation(animDown); break; caseSTATE_RELEASE_REFRESH: tvTitle.setText("松开刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); ivArrow.startAnimation(animUp); break; caseSTATE_REFRESHING: tvTitle.setText("正在刷新..."); ivArrow.clearAnimation();//必须先清除动画,才能隐藏 ivArrow.setVisibility(View.INVISIBLE); pbProgress.setVisibility(View.VISIBLE); if(mListener!=null){ mListener.onRefreash(); } break; default: break; } } OnRefreashListenermListener; publicvoidsetOnRefreashListener(OnRefreashListenerlistener){ mListener=listener; } publicinterfaceOnRefreashListener{ voidonRefreash(); voidonLoadMore(); } /** *收起下拉刷新的控件 */ publicvoidonRefreashComplete(){ if(isLoadingMOre){ footerView.setPadding(0,-mFooterViewHeight,0,0);//隐藏脚布局 isLoadingMOre=false; }else{ mCurrrentState=STATE_PULL_REFRESH; tvTitle.setText("下拉刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); mHeaderView.setPadding(0,-measuredHeight,0,0);//隐藏 } } publicvoidnoFooterView(){ footerView.setPadding(0,mFooterViewHeight,0,0);//隐藏脚布局 } }
代码中引用RefreashListView
packagecom.itguang.dell_pc.myapplication.base; importandroid.app.Activity; importandroid.support.v4.view.PagerAdapter; importandroid.support.v4.view.ViewPager; importandroid.text.TextUtils; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.BaseAdapter; importandroid.widget.ImageView; importandroid.widget.ListView; importandroid.widget.TextView; importandroid.widget.Toast; importcom.google.gson.Gson; importcom.itguang.dell_pc.myapplication.R; importcom.itguang.dell_pc.myapplication.domain.NewsData; importcom.itguang.dell_pc.myapplication.domain.TabData; importcom.itguang.dell_pc.myapplication.globe.GlobeContents; importcom.itguang.dell_pc.myapplication.view.RefreshListView; importcom.lidroid.xutils.BitmapUtils; importcom.lidroid.xutils.HttpUtils; importcom.lidroid.xutils.ViewUtils; importcom.lidroid.xutils.exception.HttpException; importcom.lidroid.xutils.http.ResponseInfo; importcom.lidroid.xutils.http.callback.RequestCallBack; importcom.lidroid.xutils.http.client.HttpRequest; importcom.lidroid.xutils.view.annotation.ViewInject; importcom.viewpagerindicator.CirclePageIndicator; importjava.util.ArrayList; /** *作者:小光哥on2016/4/22. *邮箱:1445037803@qq.com *修订历史: *描述: *┏┓┏┓ *┏┛┻━━━┛┻┓━━━━┻┓ *┃┃ *┃━┃ *┃><┃ *┃┃ *┃...⌒...┃ *┃┃ *┗━┓┏━┛ *┃┃Codeisfarawayfrombugwiththeanimalprotecting *┃史┃神兽保佑,代码无bug *┃诗┃ *┃之┃ *┃宠┃ *┃┃ *┃┗━━━┓ *┃BUG天敌┣┓┣┓┣┓┣┓┣┓ *┃┏┛ *┗┓┓┏━┳┓┏┛ *┃┫┫┃┫┫ *┗┻┛┗┻┛ */ /** *也签详情页 */ publicclassTabDetailPagerextendsBaseMenuDetailPagerimplementsViewPager.OnPageChangeListener{ /** *@paramactivity *@paramnewsTabData */ NewsData.NewsTabDatamTabdata; privateStringmUrl; privateTabDatamTabDetailData; @ViewInject(R.id.vp_news) privateViewPagermViewPager; @ViewInject(R.id.lv_newslist) privateRefreshListViewnewsListView;//新闻列表 @ViewInject(R.id.tv_title) privateTextViewtvTitle;//新闻标题 @ViewInject(R.id.indicator) privateCirclePageIndicatorindicator;//头条新闻指示器 privateArrayList<TabData.TopNewsData>mTopNewsList;//新闻数据集合 privateint[]images; privateArrayList<TabData.TabNewsData>mNewsList;//新闻数据集合 privateStringmMoreUrl; privateNewsAdaptermNewsAdapter; publicTabDetailPager(Activityactivity,NewsData.NewsTabDatanewsTabData){ super(activity); mTabdata=newsTabData; mUrl=GlobeContents.SERVER_URL+mTabdata.url; } @Override publicViewinitViews(){ images=newint[]{R.drawable.topnews1,R.drawable.topnews21,R.drawable.topnews31,R.drawable.topimage}; Viewview=View.inflate(mActivity,R.layout.tab_detail_pager,null); ViewheaderView=View.inflate(mActivity,R.layout.list_header_topnews,null);//加载头布局 //TextViewtvTitle=(TextView)view.findViewById(R.id.tv_title); //事件注入 ViewUtils.inject(this,view); ViewUtils.inject(this,headerView); mViewPager.addOnPageChangeListener(this); //将肥头条新闻以头布局形式加载到listView中 newsListView.addHeaderView(headerView); //设置下拉刷新监听 newsListView.setOnRefreashListener(newRefreshListView.OnRefreashListener(){ @Override publicvoidonRefreash(){ getDataFromServer(); } @Override publicvoidonLoadMore(){ if(mMoreUrl!=null){ getMoreDataFromServer(); }else{ Toast.makeText(mActivity,"没有更多数据了",Toast.LENGTH_SHORT).show(); newsListView.onRefreashComplete(); //newsListView.noFooterView(); } } }); returnview; } @Override publicvoidinitData(){ getDataFromServer();//这是一个异步的, } privatevoidgetDataFromServer(){ HttpUtilsutils=newHttpUtils(); utils.send(HttpRequest.HttpMethod.GET,mUrl,newRequestCallBack<String>(){ @Override publicvoidonSuccess(ResponseInfo<String>responseInfo){ Stringresult=(String)responseInfo.result; //System.out.println("页签详情页返回结果:+++++++++++++++++++"+result); praseData(result,false); newsListView.onRefreashComplete(); } @Override publicvoidonFailure(HttpExceptione,Strings){ Toast.makeText(mActivity,"获取Tabdetaildata失败!",Toast.LENGTH_SHORT).show(); //error.printStackTrace(); } }); } /** *加载下一页数据 */ privatevoidgetMoreDataFromServer(){ HttpUtilsutils=newHttpUtils(); utils.send(HttpRequest.HttpMethod.GET,mMoreUrl,newRequestCallBack<String>(){ @Override publicvoidonSuccess(ResponseInfo<String>responseInfo){ Stringresult=(String)responseInfo.result; //System.out.println("页签详情页返回结果:+++++++++++++++++++"+result); praseData(result,true); newsListView.onRefreashComplete(); } @Override publicvoidonFailure(HttpExceptione,Strings){ Toast.makeText(mActivity,"获取Tabdetaildata失败!",Toast.LENGTH_SHORT).show(); //error.printStackTrace(); } }); } /** *把json字符串解析成为json对象 * *@paramresult要解析的的json字符串 */ privatevoidpraseData(Stringresult,booleanisLoadMore){ Gsongson=newGson(); mTabDetailData=gson.fromJson(result,TabData.class);//返回TabData对象 System.out.println("页签详情页:+++++++++++++++++++++"+mTabdata); //处理更多页面的逻辑 finalStringmore=mTabDetailData.data.more; if(!TextUtils.isEmpty(more)){ mMoreUrl=GlobeContents.SERVER_URL+more; }else{ mMoreUrl=null; } if(!isLoadMore){ mTopNewsList=mTabDetailData.data.topnews; mNewsList=mTabDetailData.data.news; if(mTopNewsList!=null){ mViewPager.setAdapter(newTopNewsAdapter()); indicator.setOnPageChangeListener(this); indicator.setViewPager(mViewPager);//在设置完适配器后,在设置指示器 indicator.setSnap(true);//设置快照显示 indicator.onPageSelected(0);//indicator会自作聪明,离开时会记录当前位置 tvTitle.setText(mTopNewsList.get(0).title); } mNewsAdapter=newNewsAdapter(); //填充新闻列表 if(mNewsList!=null){ newsListView.setAdapter(mNewsAdapter); } }else{//如果是加载下一页,需要将数据追加给原来的集合 ArrayList<TabData.TabNewsData>news=mTabDetailData.data.news; mNewsList.addAll(news); mNewsAdapter.notifyDataSetChanged();//刷新ListView } } @Override publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){ } @Override publicvoidonPageSelected(intposition){//更新头条新闻标题 TabData.TopNewsDatatopNewsData=mTopNewsList.get(position); tvTitle.setText(topNewsData.title); } @Override publicvoidonPageScrollStateChanged(intstate){ } /** *ListView适配器 */ classNewsAdapterextendsBaseAdapter{ privatefinalBitmapUtilsutils; NewsAdapter(){ utils=newBitmapUtils(mActivity); utils.configDefaultLoadingImage(R.drawable.pic_item_list_default); } @Override publicintgetCount(){ returnmNewsList.size(); } @Override publicObjectgetItem(intposition){ returnmNewsList.get(position); } @Override publiclonggetItemId(intposition){ returnposition; } @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ ViewHolderholder; if(convertView==null){ convertView=View.inflate(mActivity,R.layout.list_news_item,null); holder=newViewHolder(); holder.ivPic=(ImageView)convertView.findViewById(R.id.iv_pic); holder.tvTitle=(TextView)convertView.findViewById(R.id.tv_title); holder.tvDate=(TextView)convertView.findViewById(R.id.tv_date); convertView.setTag(holder); }else{ holder=(ViewHolder)convertView.getTag(); } TabData.TabNewsDataitem=(TabData.TabNewsData)getItem(position); holder.tvTitle.setText(item.title); holder.tvDate.setText(item.pubdate); utils.display(holder.ivPic,item.listimage); returnconvertView; } } staticclassViewHolder{ publicTextViewtvTitle; publicTextViewtvDate; publicImageViewivPic; } /** *Viewpager适配器 */ classTopNewsAdapterextendsPagerAdapter{ privateBitmapUtilsbitmapUtils; TopNewsAdapter(){ bitmapUtils=newBitmapUtils(mActivity); bitmapUtils.configDefaultLoadingImage(R.drawable.topnews_item_default);//设置默认图片 } @Override publicintgetCount(){ returnmTabDetailData.data.topnews.size(); } @Override publicbooleanisViewFromObject(Viewview,Objectobject){ returnview==object; } @Override publicObjectinstantiateItem(ViewGroupcontainer,intposition){ ImageViewimageView=newImageView(mActivity); imageView.setImageResource(images[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY);//基于控件大小填充图片 //TabData.TopNewsDatatopNewsData=mTopNewsList.get(position); //bitmapUtils.display(imageView,mTabDetailData.data.topnews.get(position).url); container.addView(imageView); returnimageView; } @Override publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){ container.removeView((View)object); } } }
以上所述是小编给大家介绍的ListView实现下拉刷新加载更多的实例代码(直接拿来用)的全部叙述,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对毛票票网站的支持!