您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Android基于GridView实现自定义上拉更多和下拉刷新
北京千锋互联科技有限公司版权所有Android基于GridView实现自定义上拉更多和下拉刷新GridView上拉更多和下拉刷新的原理分析:1:要解决的问题:GridView和ListView不一样listView直接提供了addFootView和addHeadView两个方法,GridView是没有这两个方法的.猜想解决方案:GridView既然是不能直接添加HeadView和FootView的那么可以借助于组合控件.2:猜想产生的问题如果借助于组合控件的话那么GridView的滑动和FootView的滑动是独立的,没有相关联(也就是说,GridView的滑动与否和FootVew本身没有任何的联系)猜想解决方案:如果我们借助于,ScrollView来进行滑动的话那么在ScrollView的底部有了这个FootView的话那么是可以滑动的3:猜想产生的问题ScrollView和GridView不一样,ScrollView是不能直接给添加适配器的猜想解决方案使用ScrollView中嵌套一个布局不居中包括GridView和一个底部的FootView4:ScrollView中嵌套GridView的时候会造成显示不全的问题,需要解决ScrollView计算孩子高度的问题解决方案:可以重写GridView中的onMeasure()方法,然后给定孩子高度的最大值,然后再设计一个测量的模式.protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){intexpectHeight=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec,heightMeasureSpec);}5:需要解决什么时候滑动到了底部和顶部解决方案:可以通过计算ScrollView孩子的高度,以及当前孩子滑动的顶部的相对的Y的偏移量getScrollY和当前窗体的高度getHeight.如果getScrollY+getHeight=孩子的高度,说明滑动到底部了北京千锋互联科技有限公司版权所有6:解决问题:ScrollView知道了什么时候滑动到底部,如何将上级的状态解决方案:直接通过回调的方法将状态在传递到上级页面7:整合所有的对象源代码如下:GridViewpublicclassMyGridViewextendsGridView{publicMyGridView(Contextcontext,AttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);}publicMyGridView(Contextcontext){super(context);}publicMyGridView(Contextcontext,AttributeSetattrs){super(context,attrs);}@OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){intheighMeasureSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec,heighMeasureSpec);}}MyScrollViewpublicclassMyScrollViewextendsScrollView{privatestaticfinalStringLOAD=load;//表示的是加载数据的状态privatestaticfinalStringREFRESH=refresh;//表示的是需要刷新页面的状态publicMyScrollView(Contextcontext,AttributeSetattrs){super(context,attrs);}interfaceICallBack{publicvoidnotifactionAbovePage(Stringtag);}北京千锋互联科技有限公司版权所有ICallBackmICallBack=null;publicvoidsetOnCallBackLister(ICallBackmICallBack){this.mICallBack=mICallBack;}@OverrideprotectedvoidonScrollChanged(intl,intt,intoldl,intoldt){super.onScrollChanged(l,t,oldl,oldt);if(getChildAt(0)!=null){//有这个孩子才有意义的ViewchildView=getChildAt(0);//第二步:通过孩子获取孩子本身的高度intchildMeasuredHeight=childView.getMeasuredHeight();//第三步:获取屏幕顶部的相对y坐标intscrollY=getScrollY();//屏幕顶部相对的y坐标//第四步:获取当前屏幕的高度intscreenHeight=getHeight();if(scrollY+screenHeight==childMeasuredHeight){//说明滑动到底部了?//这个地方是有遗留的问题的最后还需要处理if(PullUpLoadView.getDownLoadingOrNot()){return;}mICallBack.notifactionAbovePage(LOAD);}}}}PullUpLoadView北京千锋互联科技有限公司版权所有publicclassPullUpLoadViewextendsLinearLayout{privatestaticfinalStringLOAD=load;//表示的是加载数据的状态privatestaticfinalStringREFRESH=refresh;//表示的是需要刷新页面的状态MyGridViewmMyGridView;LinearLayoutfootView;MyScrollViewmMyScrollView;staticbooleandownLoadingOrNot=false;//判断当前是否正在加载数据publicPullUpLoadView(Contextcontext,AttributeSetattrs){super(context,attrs);initView();}/***初始化数据用的*/privatevoidinitView(){//初始化布局加载器LayoutInflatermLayoutInflater=(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);Viewview=mLayoutInflater.inflate(R.layout.scroll_grid_footview,this);//这句话的意思是把当前的布局绑定给谁findView(view);setCallBack();}/***写一个方法来实现回调*/privatevoidsetCallBack(){mMyScrollView.setOnCallBackLister(newOnCallBack());北京千锋互联科技有限公司版权所有}/***定义一个接口回调到Activity页面*/publicinterfacePullCallBack{publicvoidload();publicvoidrefresh();}PullCallBackmPullCallBack=null;publicvoidsetPullCallBacklistener(PullCallBackmPullCallBack){this.mPullCallBack=mPullCallBack;}/***上一个页面回调的状态*/privateclassOnCallBackimplementsMyScrollView.ICallBack{@OverridepublicvoidnotifactionAbovePage(Stringtag){if(tag.equals(LOAD)){//说明需要加载数据//在这个地方我们书不是需要将这个状态发送到Activity这个页面去mPullCallBack.load();handler.sendEmptyMessage(100);downLoadingOrNot=true;//表示的额是正在加载}else{//说明需要刷新数据}}}北京千锋互联科技有限公司版权所有//刷新UIHandlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){case100://表示的是需要显示底部的ViewsetFootViewVisible();break;case101://表示的是需要隐藏底部的ViewsetFootViewHide();downLoadingOrNot=false;break;}}};/***获取是否正在加载数据的这个状态*@return*/publicstaticbooleangetDownLoadingOrNot(){returndownLoadingOrNot;}/***说明数据已经加载完成*这个方法是Activity调用的*/publicvoiddataDone(){handler.sendEmptyMessage(101);北京千锋互联科技有限公司版权所有}/***找下那个View*@paramview*/privatevoidfindView(Viewview){mMyGridView=(MyGridView)findViewById(R.id.gridView);footView=(LinearLayout)findViewById(R.id.footView);mMyScrollView=(MyScrollView)findViewById(R.id.myScrollView);}/***返回GridView*@return*/publicMyGridViewgetMyGridView(){returnmMyGridView;}/***设置footView影藏*/publicvoidsetFootViewHide(){footView.setVisibility(View.GONE);}/***设置FootView显示*/publicvoidsetFootViewVisible(){footView.setVisibility(View.VISIBLE);北京千锋互联科技有限公司版权所有}}?xmlversion=1.0encoding=utf-8?RelativeLayoutxmlns:android=:tools=:layout_widt
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:Android基于GridView实现自定义上拉更多和下拉刷新
链接地址:https://www.777doc.com/doc-2901240 .html