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仿硅谷新闻下拉刷新/上拉加载更多,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
热门推荐
10 诗词送行祝福语大全简短
11 新房开工吉日祝福语简短
12 50多岁生日简短祝福语
13 安徽疫情祝福语简短英语
14 农民朋友发财祝福语简短
15 对生活祝福语简短精辟
16 搬家词简短祝福语朋友
17 女神结婚快乐祝福语简短
18 文学短句祝福语大全简短