更多内容请访问:Harmonyos.51cto.com,与华为官方共同打造的鸿蒙技术社区一、简介PageSliderProvider是为PageSlider组件提供的一个页面适配器,用于管理页面浏览量。PageSliderProvider类提供页面项管理功能,例如统计可用视图的数量以及在指定位置创建组件。您需要继承并实现PageSliderProvider才能在不同页面显示多个视图。PageSliderProvider类的使用比较简单,但是在复杂的业务场景中使用时,需要做的工作比较多,而且这些工作是重复的。所以在写本章案例的同时,我对PageSliderProvider做了一个通用的封装,把代码分享到Gitee上,并将封装后的代码打包成一个har包,提交到Maven中央仓库,供大家使用。码云Gitee仓库地址二、方法介绍PageSliderProvider方法需要掌握的并不多。一般只需要重写以下四个方法即可为PageSlider提供Page数据支持。PageSliderProvider类还提供了刷新Page页面数据所需的方法。这些方法可以相互配合,实现Page页面数据的准确更新。3、封装与分析PageSliderProvider是一个abstract抽象类。每次使用这个类,都需要继承并重写相应的抽象方法。这种重复性的工作,写多了,繁琐,浪费时间,降低开发效率。因此,为了高效易用,我们首先对PageSliderProvider进行一定程度的封装。封装数据源。在常规的业务开发模式中,为PageSliderProvider提供页面元数据是最基础的工作,一般会将一个复杂的Object对象实例集合添加到一个List列表中。考虑到数据的通用性,这里我们也会使用泛型来封装PageSliderProvider类。publicabstractclassBasePageSliderProviderextendsPageSliderProvider{//页面加载数据源privatefinalListmPageSliderSourceData;//构造函数初始化列表集合publicBasePageSliderProvider(){this.mPageSliderSourceData=newArrayList<>();}/***提供外部数据源清除操作方法,**以后需要根据业务判断是否需要调用notifyDataChanged()方法*/publicfinalvoidclearSourceData(){mPageSliderSourceData.clear();}/***提供setting/reset的操作方法数据源对外,**后续需要根据业务判断是否需要调用notifyDataChanged()方法*@paramdata*/publicfinalvoidsetSourceData(Listdata){if(!data.isEmpty()){mPageSliderSourceData.clear();mPageSliderSourceData.addAll(data);}}/***添加外部数据源的操作方法在加载更多数据时可能会有用。**后续需要根据业务判断是否需要调用notifyDataChanged()方法*@paramdata*/publicfinalvoidappendSourceData(Listdata){if(!data.isEmpty()){mPageSliderSourceData.addAll(data);}}/***对外提供删除指定数据源的操作方法。**以后需要根据业务判断是否需要调用notifyDataChanged()方法。*@paramdata*/publicfinalvoidremoveSourceData(Mdata){if(data!=null){mPageSliderSourceData.remove(data);}}/***提供获取指定位置数据的外部操作方法*@paramposition*@return*/publicfinalMgetItem(intposition){returnmPageSliderSourceData.get(position);}/***并使用final修饰,防止子类继承覆盖,造成问题。*@return*/@OverridepublicfinalintgetCount(){returnmPageSliderSourceData.size();}}在重写PageSliderProvider类的getCount()抽象方法时,用final关键字修饰该方法,防止子类继承重写,造成问题。页面视图组件的封装。页面视图组件是嵌入式设备应用开发中最需要关注的。嵌入式设备内存资源有限,页面视图组件占用内存资源比较大。如果处理不好,甚至会影响申请的顺利进行。性和稳定性。因此,在封装页面视图组件时,需要考虑视图组件的快速创建和及时回收,防止内存泄漏/溢出等问题。在以往的应用开发经验中,ViewHolder绑定视图组件是一种很好的模式,非常高效的解决了视图组件的回收复用。本次我们也采用这种ViewHolder方式封装页面视图组件,在PageSliderProvider类中进行简单的组件回收复用处理。创建用于绑定页面视图组件的PageViewHolder类。在PageViewHolder类中进行了简单的视图组件封装,业务开发中继承该类实现更多更复杂的组件操作。publicabstractclassPageViewHolder{protectedfinalComponentcomponent;publicPageViewHolder(Componentcomponent){this.component=component;}/***返回绑定的视图组件*@return*/publicfinalComponentgetComponent(){returncomponent;}}在具体业务开发中,使用的ViewHolder必须是PageViewHolder的子类无法确定具体的实例对象类型。所以在重写PageSliderProvider类的时候,我们也需要使用泛型来实现通用性。对于页面视图组件的回收复用,我们在日常的简单操作中使用列表或者队列进行存储,模拟回收站的功能。创建和销毁组件的方法中的重用和回收操作,达到了重复回收的目的,减少了多次创建页面视图组件带来的性能消耗。publicabstractclassBasePageSliderProviderextendsPageSliderProvider{//页面PageViewHolder缓存,主要保存当前处于活跃状态的PageViewHolder对象privatefinalHashMapmPageSliderComponentCache;//页面PageViewHolder回收站privatefinalQueuemPageSliderComponentRecyclers;publicBasePageSliderProvider(){this.mPageSliderComponentCache=newHashMap<>();this.mPageSliderComponentRecyclers=newLinkedBlockingQueue<>();}/***提供获取指定位置PageViewHoder对象的方法*@paramposition*@return*/publicfinalVHgetPageViewHolder(intposition){returnmPageSliderComponentCache.get(position);}@OverridepublicObjectcreatePageInContainer(ComponentContainercomponentContainer,intindex){if(componentContainer==null||index>=getCount()){returnOptional.empty();}//从PageViewHolder回收站中获取对象,如果没有,创建一个新的PageViewHolder示例VHpageViewHolder=mPageSliderComponentRecyclers.poll();if(pageViewHolder==null){pageViewHolder=onCreatePageViewHolder(componentContainer,index);}onBindPageViewHolder(pageViewHolder,index);componentContainer.addComponent(pageViewHolder.getComponent());//添加到缓存中>=getCount()){return;}if(objectinstanceofPageViewHolder){componentContainer.removeComponent(((PageViewHolder)object).getComponent());mPageSliderComponentCache.remove(index);//回收已经销毁的PageViewHoldermPageSliderComponentRecyclers.offer((VH)object);}}@OverridepublicbooleanisPageMatchToObject(Componentcomponent,Objectobject){if(objectinstanceofPageViewHolder){returncomponent==((PageViewHolder)object).getComponent();}returncomponent==object;}/***创建并返回一个PageViewHolderobject*@paramcomponentContainer*@paramposition*@return*/protectedabstractVHonCreatePageViewHolder(ComponentContainercomponentContainer,intposition);/***为PageViewHolderob绑定数据在指定位置喷射*@paramholder*@paramposition*/protectedabstractvoidonBindPageViewHolder(VHholder,intposition);}4.应用实战经过一系列简单的封装,PageSliderProvider类就很容易上手了。我们不需要再次绑定页面数据和组件。去做轮子吧。直接继承BasePageSliderProvider类,重写onCreatePageViewHolder和onBindPageViewHolder这两个方法,直接绑定数据完成PageSlider组件数据和页面组件的提供。1.在项目布局目录下创建一个页面布局文件。例如:component_page.xml2.继承PageViewHolder类,绑定Page页面布局组件。例如:CasePageViewHolderprivatestaticclassCasePageViewHolderextendsPageViewHolder{privateTextmTextCom;publicCasePageViewHolder(Componentcomponent){super(component);mTextCom=(Text)component.findComponentById(ResourceTable.Id_text_component);}publicvoidsetText(Stringtext){mTextCom.setText(text);}publicvoidsetBackground(RgbColorcolor){Sh??apeElementelement=newShapeElement();element.setShape(ShapeElement.RECTANGLE);element.setRgbColor(color);mTextCom.setBackground(element);}}3.继承BasePageSliderProvider类,绑定Page数据源和PageViewHolder。privatestaticclassCasePageSliderProviderextendsBasePageSliderProvider{@OverrideprotectedCasePageViewHolderonCreatePageViewHolder(ComponentContainercomponentContainer,intposition){LayoutScatterlayoutScatter=LayoutScatter.getInstance(componentContainer.getContext());Componentcomponent=layoutScatter.parse(ResourceTable.Layout_component_page,componentViewHolder@Case);OverrideprotectedvoidonBindPageViewHolder(CasePageViewHolderholder,intposition){PageInfopageInfo=getItem(position);holder.setText(pageInfo.getContent());holder.setBackground(pageInfo.getColor());}}4.初始页面元数据和PageSlider组件,并将PageSliderProvider对象绑定到PageSlider组件中。publicclassMainAbilitySliceextendsAbilitySlice{privatePageSlidermPageSlider;privateCasePageSliderProvidermPageSliderProvider;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);mPageSlider=(PageSlider)findComponentById(ResourceTable.Id_page_slider_component);mPageSliderProvider=newCasePageSliderProvider();mPageSliderProvider.setSourceData(createAndInitPageData());mPageSlider.setProvider(mPageSliderProvider);}//初始化页面元数据privateListcreateAndInitPageData(){ListinitData=newArrayList<>();for(inti=0;i<15;i++){PageInfopageInfo=newPageInfo();chartempChar=(char)(newRandom().nextInt(26)+65);pageInfo.setContent("Case"+String.valueOf(tempChar));pageInfo.setColor(newRgbColor(newRandom)().nextInt(255),newRandom().nextInt(255),newRandom().nextInt(255));initData.add(pageInfo);}returninitData;}privatestaticclassPageInfo{privateStringcontent;privateRgbColor颜色;publicStringgetContent(){returncontent;}publicvoidsetContent(Stringcontent){this.content=content;}publicRgbColorgetColor(){returncolor;}publicvoidsetColor(RgbColorcolor){this.color=color;}}}5.总结这里只是简单的一对PageSliderProvider类已经封装测试,代码已经提交到码云Gitee仓库,进行了Maven中央仓库管理。PageSliderProvider类其实可以进行更多的功能改造,封装起来更加高效易用。有兴趣的可以直接在码云Gitee仓库进行代码分享。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区