Android 仿硅谷新闻下拉刷新/上拉加载更多
1.添加加载更多布局
1_初始化和隐藏代码
在RefreshListView构造方法中调用
privatevoidinitFooterView(Contextcontext){ ViewfooterView=View.inflate(context,R.layout.refresh_listview_footer,null); //隐藏代码 footerView.measure(0,0); intfooterViewHeight=footerView.getMeasuredHeight(); footerView.setPadding(0,-footerViewHeight,0,0); this.addFooterView(footerView); }
2_布局文件refresh_listview_footer.xml
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal"> <ProgressBar android:layout_margin="5dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminateDrawable="@drawable/custom_progressbar"/> <TextView android:layout_marginLeft="10dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载更多中..." android:textColor="#ff0000" android:textSize="25sp"/> </LinearLayout>
2.拖动到底部的时候
/** *菜单页面对应的新闻页签页面 *总共有12个 *@authorAdministrator * */ publicclassTabMenuDetailPagerextendsMenuDetailBasePagerimplementsOnPageChangeListener{ /** *新闻中心-新闻菜单对应的标签对应的数据 */ privateNewCenterTagnewCenterTag; ....................... /** *加载更多数据的URL */ privateStringmoreUrl; /** *是否加载更多数据中 */ protectedbooleanisLoadingMore=false; ................... @Override publicViewinitView(){ Viewview=View.inflate(mActivity,R.layout.tab_detail,null); //把View注入到XUtils框架中 ViewUtils.inject(this,view); .......................... //设置监听下拉刷新 mListView.setOnRefreshListener(newOnRefreshListener(){ @Override publicvoidonPullDownRefresh(){ isPullDownRefreshing=true; getDataFromNet(); } @Override publicvoidonLoadingMore(){ if(TextUtils.isEmpty(moreUrl)){ Toast.makeText(mActivity,"没有更多数据了",1).show(); mListView.onRefreshFinish(false); }else{ //有更多数据,要加载更多数据了 getMoreDataFromNet(); } } }); returnview; } /** *加载更多数据 */ protectedvoidgetMoreDataFromNet(){ HttpUtilshttpUtils=newHttpUtils(); httpUtils.send(HttpMethod.GET,moreUrl,newRequestCallBack<String>(){ @Override publicvoidonSuccess(ResponseInfo<String>responseInfo){ System.out.println("加载更多数据成功:"+responseInfo.result); mListView.onRefreshFinish(false); isLoadingMore=true; processData(responseInfo.result); } @Override publicvoidonFailure(HttpExceptionerror,Stringmsg){ mListView.onRefreshFinish(false); System.out.println("加载更多数据失败:"+msg); } }); } /** *处理和解析json数据 *@paramjson */ protectedvoidprocessData(Stringjson){ TabDetailBeanbean=parserJson(json); if(!isLoadingMore){ System.out.println(bean.data.news.get(0).title); topnews=bean.data.topnews; //给ViewPager设置适配器 TabDetailAdapteradapter=newTabDetailAdapter(); mViewPager.setAdapter(adapter); //把所有的View清除 ll_point_group.removeAllViews(); for(inti=0;i<topnews.size();i++){ Viewpoint=newView(mActivity); LayoutParamsparams=newLayoutParams(5,5); point.setBackgroundResource(R.drawable.tab_detail_point_bg); if(i!=0){ params.leftMargin=10; } point.setEnabled(false); point.setLayoutParams(params); ll_point_group.addView(point); } previousPointPosition=0; //设置默认的图片描述和指示点 mtv_title_description.setText(topnews.get(previousPointPosition).title); ll_point_group.getChildAt(previousPointPosition).setEnabled(true); //设置页面改变的监听 mViewPager.setOnPageChangeListener(this); //设置适配器和对应的数据 newsLists=bean.data.news; listViewAdapter=newListViewAdapter(); mListView.setAdapter(listViewAdapter); //mListView.addHeaderView(v);//把一个视图一头的方式添加到ListView中 }else{ //把列表新闻取出来,在加载到以前的集合中,在刷新数据 isLoadingMore=false; List<News>moreDataNews=bean.data.news; newsLists.addAll(moreDataNews); listViewAdapter.notifyDataSetChanged();//刷新数据 } } ................ /** *用Gson开源项目解析json *@paramjson */ privateTabDetailBeanparserJson(Stringjson){ Gsongson=newGson(); TabDetailBeanbean=gson.fromJson(json,TabDetailBean.class); moreUrl=bean.data.more; if(TextUtils.isEmpty(moreUrl)){ moreUrl=null; }else{ moreUrl=ConstantUtils.server_url+moreUrl; } returnbean; } @Override publicvoidonPageScrollStateChanged(intarg0){ //TODOAuto-generatedmethodstub } @Override publicvoidonPageScrolled(intarg0,floatarg1,intarg2){ //TODOAuto-generatedmethodstub } ............... }
3.完整代码
packagecom.atguigu.refreshlistview; 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.LinearLayout; importandroid.widget.ListView; importandroid.widget.ProgressBar; importandroid.widget.TextView; importjava.text.SimpleDateFormat; importjava.util.Date; /** *作用:自定义下拉刷新的ListView */ publicclassRefreshListviewextendsListView{ /** *下拉刷新和顶部轮播图 */ privateLinearLayoutheaderView; /** *下拉刷新控件 */ privateViewll_pull_down_refresh; privateImageViewiv_arrow; privateProgressBarpb_status; privateTextViewtv_status; privateTextViewtv_time; /** *下拉刷新控件的高 */ privateintpullDownRefreshHeight; /** *下拉刷新 */ publicstaticfinalintPULL_DOWN_REFRESH=0; /** *手松刷新 */ publicstaticfinalintRELEASE_REFRESH=1; /** *正在刷新 */ publicstaticfinalintREFRESHING=2; /** *当前状态 */ privateintcurrentStatus=PULL_DOWN_REFRESH; privateAnimationupAnimation; privateAnimationdownAnimation; /** *加载更多的控件 */ privateViewfooterView; /** *加载更多控件高 */ privateintfooterViewHeight; /** *是否已经加载更多 */ privatebooleanisLoadMore=false; /** *顶部轮播图部分 */ privateViewtopNewsView; /** *ListView在Y轴上的坐标 */ privateintlistViewOnScreenY=-1; publicRefreshListview(Contextcontext){ this(context,null); } publicRefreshListview(Contextcontext,AttributeSetattrs){ this(context,attrs,0); } publicRefreshListview(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); initHeaderView(context); initAnimation(); initFooterView(context); } privatevoidinitFooterView(Contextcontext){ footerView=View.inflate(context,R.layout.refresh_footer,null); footerView.measure(0,0); footerViewHeight=footerView.getMeasuredHeight(); footerView.setPadding(0,-footerViewHeight,0,0); //ListView添加footer addFooterView(footerView); //监听ListView的滚动 setOnScrollListener(newMyOnScrollListener()); } /** *添加顶部轮播图 *@paramtopNewsView */ publicvoidaddTopNewsView(ViewtopNewsView){ if(topNewsView!=null){ this.topNewsView=topNewsView; headerView.addView(topNewsView); } } classMyOnScrollListenerimplementsOnScrollListener{ @Override publicvoidonScrollStateChanged(AbsListViewview,intscrollState){ //当静止或者惯性滚动的时候 if(scrollState==OnScrollListener.SCROLL_STATE_IDLE||scrollState==OnScrollListener.SCROLL_STATE_FLING){ //并且是最后一条可见 if(getLastVisiblePosition()>=getCount()-1){ //1.显示加载更多布局 footerView.setPadding(8,8,8,8); //2.状态改变 isLoadMore=true; //3.回调接口 if(mOnRefreshListener!=null){ mOnRefreshListener.onLoadMore(); } } } } @Override publicvoidonScroll(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){ } } privatevoidinitAnimation(){ upAnimation=newRotateAnimation(0,-180,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,0.5f); upAnimation.setDuration(500); upAnimation.setFillAfter(true); downAnimation=newRotateAnimation(-180,-360,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,0.5f); downAnimation.setDuration(500); downAnimation.setFillAfter(true); } privatevoidinitHeaderView(Contextcontext){ headerView=(LinearLayout)View.inflate(context,R.layout.refresh_header,null); //下拉刷新控件 ll_pull_down_refresh=headerView.findViewById(R.id.ll_pull_down_refresh); iv_arrow=(ImageView)headerView.findViewById(R.id.iv_arrow); pb_status=(ProgressBar)headerView.findViewById(R.id.pb_status); tv_status=(TextView)headerView.findViewById(R.id.tv_status); tv_time=(TextView)headerView.findViewById(R.id.tv_time); //测量 ll_pull_down_refresh.measure(0,0); pullDownRefreshHeight=ll_pull_down_refresh.getMeasuredHeight(); //默认隐藏下拉刷新控件 //View.setPadding(0,-控件高,0,0);//完全隐藏 //View.setPadding(0,0,0,0);//完全显示 ll_pull_down_refresh.setPadding(0,-pullDownRefreshHeight,0,0); //添加ListView的头 addHeaderView(headerView); } privatefloatstartY=-1; @Override publicbooleanonTouchEvent(MotionEventev){ switch(ev.getAction()){ caseMotionEvent.ACTION_DOWN: //1.记录起始坐标 startY=ev.getY(); break; caseMotionEvent.ACTION_MOVE: if(startY==-1){ startY=ev.getY(); } //判断顶部轮播图是否完全显示,只有完全显示才会有下拉刷新 booleanisDisplayTopNews=isDisplayTopNews(); if(!isDisplayTopNews){ //加载更多 break; } //如果是正在刷新,就不让再刷新了 if(currentStatus==REFRESHING){ break; } //2.来到新的坐标 floatendY=ev.getY(); //3.记录滑动的距离 floatdistanceY=endY-startY; if(distanceY>0){//下拉 //intpaddingTop=-控件高+distanceY; intpaddingTop=(int)(-pullDownRefreshHeight+distanceY); if(paddingTop<0&¤tStatus!=PULL_DOWN_REFRESH){ //下拉刷新状态 currentStatus=PULL_DOWN_REFRESH; //更新状态 refreshViewState(); }elseif(paddingTop>0&¤tStatus!=RELEASE_REFRESH){ //手松刷新状态 currentStatus=RELEASE_REFRESH; //更新状态 refreshViewState(); } ll_pull_down_refresh.setPadding(0,paddingTop,0,0); //View.setPadding(0,paddingTop,0,0);//动态的显示下拉刷新控件 } break; caseMotionEvent.ACTION_UP: startY=-1; if(currentStatus==PULL_DOWN_REFRESH){ //View.setPadding(0,-控件高,0,0);//完全隐藏 ll_pull_down_refresh.setPadding(0,-pullDownRefreshHeight,0,0); }elseif(currentStatus==RELEASE_REFRESH){ //设置状态为正在刷新 currentStatus=REFRESHING; refreshViewState(); //View.setPadding(0,0,0,0);//完全显示 ll_pull_down_refresh.setPadding(0,0,0,0); //回调接口 if(mOnRefreshListener!=null){ mOnRefreshListener.onPullDownRefresh(); } } break; } returnsuper.onTouchEvent(ev); } /** *判断是否完全显示顶部轮播图 *当ListView在屏幕上的Y轴坐标小于或者等于顶部轮播图在Y轴的坐标的时候,顶部轮播图完全显示 *@return */ privatebooleanisDisplayTopNews(){ if(topNewsView!=null){ //1.得到ListView在屏幕上的坐标 int[]location=newint[2]; if(listViewOnScreenY==-1){ getLocationOnScreen(location); listViewOnScreenY=location[1]; } //2.得到顶部轮播图在屏幕上的坐标 topNewsView.getLocationOnScreen(location); inttopNewsViewOnScreenY=location[1]; //if(listViewOnScreenY<=topNewsViewOnScreenY){ //returntrue; //}else{ //returnfalse; //} returnlistViewOnScreenY<=topNewsViewOnScreenY; }else{ returntrue; } } privatevoidrefreshViewState(){ switch(currentStatus){ casePULL_DOWN_REFRESH://下拉刷新状态 iv_arrow.startAnimation(downAnimation); tv_status.setText("下拉刷新..."); break; caseRELEASE_REFRESH://手松刷新状态 iv_arrow.startAnimation(upAnimation); tv_status.setText("手松刷新..."); break; caseREFRESHING://正在刷新状态 tv_status.setText("正在刷新..."); pb_status.setVisibility(VISIBLE); iv_arrow.clearAnimation(); iv_arrow.setVisibility(GONE); break; } } /** *当联网成功和失败的时候回调该方法 *用户刷新状态的还原 * *@paramsucess */ publicvoidonRefreshFinish(booleansucess){ if(isLoadMore){ //加载更多 isLoadMore=false; //隐藏加载更多布局 footerView.setPadding(0,-footerViewHeight,0,0); }else{ //下拉刷新 tv_status.setText("下拉刷新..."); currentStatus=PULL_DOWN_REFRESH; iv_arrow.clearAnimation(); pb_status.setVisibility(GONE); iv_arrow.setVisibility(VISIBLE); //隐藏下拉刷新控件 ll_pull_down_refresh.setPadding(0,-pullDownRefreshHeight,0,0); if(sucess){ //设置最新更新时间 tv_time.setText("上次更新时间:"+getSystemTime()); } } } /** *得到当前Android系统的时间 * *@return */ privateStringgetSystemTime(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); returnformat.format(newDate()); } /** *监听控件的刷新 */ publicinterfaceOnRefreshListener{ /** *当下拉刷新的时候回调这个方法 */ publicvoidonPullDownRefresh(); /** 当加载更多的时候回调这个方法 */ publicvoidonLoadMore(); } privateOnRefreshListenermOnRefreshListener; /** *设置监听刷新,由外界设置 */ publicvoidsetOnRefreshListener(OnRefreshListenerl){ this.mOnRefreshListener=l; } }
以上所述是小编给大家介绍的Android仿硅谷新闻下拉刷新/上拉加载更多,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!