android九宫格可分页加载控件使用详解
本文实例为大家分享了android九宫格可分页加载控件的具体实现代码,供大家参考,具体内容如下
github地址
基本思路是viewpager+gridview,每一页viewpager视图有一个gridview,gridview加载九格。所以要保证数据的准确性。数据以List>的形式。控件实现了高度自适应,根据控件的个数,计算控件的高度。内部的viewpager和gridview视图都以动态创建,无需新建一个xml文件,整个控件只需要一个item的布局文件。
使用方法
使用时可以先请求一个接口,需初始化数据,数据初始化需要根据总个数初始化所有数据,在每次分页加载的时候,再通过请求当页的数据,更改数据,刷新页面。
viewPager=findViewById(R.id.ninePages); //数据初始化 List>lists=newArrayList<>(); for(inti=0;i<6;i++){//页数 List
list1=newArrayList<>(); for(intj=0;j<9;j++){//每页个数 TestEntityentity=newTestEntity(); entity.setText("j="+j+"/i="+i); list1.add(entity); } lists.add(list1); } //设置不每页重复加载 viewPager.setEveryRequest(false); //设置分页加载 viewPager.setPagingLoad(true); viewPager.setListener(newRequestDataListener (){ @Override publicvoidrequest(intposition){//分页加载 List changeList=newArrayList<>(); for(inti=0;i<9;i++){ TestEntitytestEntity=newTestEntity(); testEntity.setText("change"+i); changeList.add(testEntity); } //数据刷新 viewPager.dataInvalidate(position,changeList); } @Override publicintgridViewColumn(){//gridview列数 return3; } @Override publicViewgetView(LayoutInflaterinflater,intposition,ViewconvertView,ViewGroupparent,List list){ ViewHolderviewHolder=null; if(convertView==null){ convertView=inflater.inflate(R.layout.item_gridview,parent,false); viewHolder=newViewHolder(); viewHolder.textView=convertView.findViewById(R.id.textview); convertView.setTag(viewHolder); }else{ viewHolder=(ViewHolder)convertView.getTag(); } viewHolder.textView.setText(list.get(position).getText()); returnconvertView; } }); viewPager.setList(lists); classViewHolder{ privateTextViewtextView; }
注意:viewPager.setList(lists);要在最后调用
视图控件:
publicclassNinePagesPaginationextendsLinearLayout{ privateViewmView; privateViewPagerviewPager; privateContextcontext; privateList >list=newArrayList<>(); //已经请求过的,不在重复请求 privateList
hasAdded=newArrayList<>(); //是否每次请求 privatebooleanisEveryRequest; //是否进行分页加载 privatebooleanisPagingLoad; privateRequestDataListenerlistener; privateMyViewPagerAdapteradapter; privateViewPager.OnPageChangeListenerpageChangeListener; publicNinePagesPagination(Contextcontext,@NullableAttributeSetattrs){ super(context,attrs); this.context=context; viewPager=newViewPager(context); LayoutParamsparams=newLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); viewPager.setLayoutParams(params); mView=viewPager; addView(mView); } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ super.onMeasure(widthMeasureSpec,heightMeasureSpec); if(listener!=null&&listener.gridViewColumn()!=0){ intcolumn=listener.gridViewColumn(); introw=(int)Math.ceil((double)list.get(0).size()/column); intheightMeasureSpec2=MeasureSpec.makeMeasureSpec(row*getWidth()/column, MeasureSpec.AT_MOST); setMeasuredDimension(widthMeasureSpec,heightMeasureSpec2); } } publicvoidsetListener(RequestDataListenerlistener){ this.listener=listener; } publicvoidsetPageChangeListener(ViewPager.OnPageChangeListenerpageChangeListener){ this.pageChangeListener=pageChangeListener; } publicvoidsetEveryRequest(booleaneveryRequest){ isEveryRequest=everyRequest; } publicvoidsetPagingLoad(booleanpagingLoad){ isPagingLoad=pagingLoad; } publicvoidsetList(List >list){ this.list=list; initView(); invalidate(); } privatevoidinitView(){ adapter=newMyViewPagerAdapter(context,list,listener); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(newViewPager.OnPageChangeListener(){ @Override publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){ if(pageChangeListener!=null){ pageChangeListener.onPageScrolled(position,positionOffset,positionOffsetPixels); } } @Override publicvoidonPageSelected(intposition){ if(pageChangeListener!=null){ pageChangeListener.onPageSelected(position); } if(isPagingLoad){//分页加载 if(isEveryRequest){//每次都请求 adapter.setCurrentPosition(position); listener.request(position); }else{//请求过一次将不在重复请求 if(!hasAdded.contains(position)){ hasAdded.add(position); adapter.setCurrentPosition(position); listener.request(position); } } } } @Override publicvoidonPageScrollStateChanged(intstate){ if(pageChangeListener!=null){ pageChangeListener.onPageScrollStateChanged(state); } } }); } //数据刷新 publicvoiddataInvalidate(intposition,List
changeList){ list.set(position,changeList); adapter.notifyDataSetChanged(); } }
viewpager适配器:
publicclassMyViewPagerAdapterextendsPagerAdapter{ privateContextcontext; privateList >list; privateLayoutInflaterinflater; privateMyGridViewAdapteradapter; privateintcurrentPosition; privateRequestDataListenerlistener; publicMyViewPagerAdapter(Contextcontext,List
>list,RequestDataListenerlistener){ this.context=context; this.list=list; this.listener=listener; inflater=LayoutInflater.from(context); } @Override publicintgetCount(){ returnlist.size(); } @Override publicbooleanisViewFromObject(@NonNullViewview,@NonNullObjectobject){ returnview==object; } @NonNull @Override publicObjectinstantiateItem(@NonNullViewGroupcontainer,intposition){ GridViewview=newGridView(context); ViewGroup.LayoutParamsparams=newViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); view.setLayoutParams(params); view.setTag(position); if(listener!=null&&listener.gridViewColumn()!=0){ view.setNumColumns(listener.gridViewColumn()); } adapter=newMyGridViewAdapter(context,list.get(position),listener); view.setAdapter(adapter); container.addView(view); returnview; } @Override publicvoiddestroyItem(@NonNullViewGroupcontainer,intposition,@NonNullObjectobject){ container.removeView((View)object); } @Override publicintgetItemPosition(@NonNullObjectobject){ //viewpager立即刷新页面 if(list!=null&&list.size()==0){ returnPOSITION_NONE; } Viewview=(View)object; if(currentPosition==(Integer)view.getTag()){ returnPOSITION_NONE; }else{ returnPOSITION_UNCHANGED; } } @Override publicvoidnotifyDataSetChanged(){ super.notifyDataSetChanged(); if(adapter!=null){ adapter.notifyDataSetChanged(); } } publicvoidsetCurrentPosition(intcurrentPosition){ this.currentPosition=currentPosition; } }
gridview适配器
publicclassMyGridViewAdapterextendsBaseAdapter{ privateContextcontext; privateList list; privateLayoutInflaterinflater; privateRequestDataListenerlistener; publicMyGridViewAdapter(Contextcontext,List list,RequestDataListenerlistener){ this.context=context; this.list=list; this.listener=listener; inflater=LayoutInflater.from(context); } @Override publicintgetCount(){ returnlist.size(); } @Override publicObjectgetItem(intposition){ returnlist.get(position); } @Override publiclonggetItemId(intposition){ returnposition; } @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ convertView=listener.getView(inflater,position,convertView,parent,list); intwidth; //计算item的宽 if(listener!=null&listener.gridViewColumn()!=0){ width=parent.getWidth()/listener.gridViewColumn(); }else{ width=parent.getWidth()/3; } //设置item的宽高相等 convertView.setLayoutParams(newAbsListView.LayoutParams(width,width)); returnconvertView; } }
暴露的接口
publicinterfaceRequestDataListener{ voidrequest(intposition); //gridView列数 intgridViewColumn(); ViewgetView(LayoutInflaterinflater,intposition,ViewconvertView,ViewGroupparent,List list); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。