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实现下拉刷新加载更多的实例代码(直接拿来用)的全部叙述,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对毛票票网站的支持!