HarmonyOS技术社区 · 2021年03月05日

鸿蒙OS前端开发入门指南——ListContainer教程

目录:
1、布局模板
2、创建数据提供者实体类并且继承 RecycleItemProvider 实现其方法
3、RecycleItemProvider是提供数据与组件关联器来的方法
4、创建数据实体类
5、创建数据模板
6、获取listContainer 并且绑定数据模板

当前教程项目地址 https://gitee.com/blueskyliu/...

建议看着代码看我这个解释

提供在屏幕上向上或向下滚动时显示的列表容器。这个类继承自ComponentContainer。它使用BaseItemProvider或RecycleItemProvider来存储对象

根据上面的定义我们得知 ListContainer 是列表容器,用来渲染重复性布局的容器

渲染条件

1.布局模板

官方推荐使用xml来写布局这里我们也用的是xml写模板布局

<?xml version="1.0" encoding="utf-8" ?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:id="$+id:dynamicitem"
    ohos:height="match_content"
    ohos:width="match_parent"
    >
    <!--        第一层-->
    <DirectionalLayout
            ohos:width="match_parent"
            ohos:height="match_content"
            ohos:orientation="horizontal"
        >
        <DirectionalLayout
            ohos:width="match_parent"
            ohos:height="match_content"
            ohos:orientation="horizontal"
            >
            <Image
                ohos:height="40vp"
                ohos:width="40vp"
                ohos:image_src="$media:log.png"
                ohos:scale_mode="stretch"
                ></Image>
          <DirectionalLayout
              ohos:width="match_parent"
              ohos:height="match_content"
              >
              <Text
                  ohos:text_size="19fp"
                  ohos:width="match_content"
                  ohos:height="match_content"
                  ohos:text_color="#FFFFFF"
                  ohos:text="蓝天的测试"
                  ohos:id="$+id:authname"
                  ohos:scale_mode="stretch"
                  ></Text>
              <DirectionalLayout
                  ohos:orientation="horizontal"
                  ohos:width="match_content"
                  ohos:height="match_content"
                  >
                  <Image
                      ohos:height="10vp"
                      ohos:width="10vp"
                      ohos:image_src="$media:log.png"
                      ohos:scale_mode="stretch"
                      ></Image>
                  <Text
                      ohos:text_size="19fp"
                      ohos:width="match_content"
                      ohos:height="match_content"
                      ohos:text_color="#FFFFFF"
                      ohos:text="郑州市金水区"
                      ></Text>
              </DirectionalLayout>
          </DirectionalLayout>
        </DirectionalLayout>
    </DirectionalLayout>
</DirectionalLayout>
  1. 创建数据提供者实体类并且继承 RecycleItemProvider 实现其方法

    提供一个RecycleItemProvider对象,以将ComponentProvider项与组件的基本数据关联起来。回收器适配器扩展了BaseItemProvider。数据集中的每个组件项都可以使用它来释放内存资源。

  2. 根据上面的定义我们得知 RecycleItemProvider是提供数据与组件关联器来的方法
package com.example.myapplication2048.itemprovider;

import com.example.myapplication2048.ResourceTable;
import com.example.myapplication2048.datamodel.DynamicItemInfo;
import ohos.agp.components.*;
import ohos.app.AbilityContext;
import ohos.app.Context;

import java.util.List;

public class DynamicProvider extends RecycleItemProvider {
    /**
     * 卡片盒子模型
     */
    private List<DynamicItemInfo> dynamicModels;
    /**
     * 应用程序可以使用AbilityContext来获取资源、启动能力、
     * 创建或获取线程模型,以及获取应用程序包信息和运行信息。
     * 一个能力就是ability context的一个实例。
     * 总之只要操作就需要getcontext 因为他需要这个环境 就好比人对水的需求 盖房子 做饭 都需要水一样
     */

    public DynamicProvider(List<DynamicItemInfo> dynamicModels) {
        this.dynamicModels = dynamicModels;
    }

    /**
     * :
     * @return获取提供程序中数据项的总数
     */
    @Override
    public int getCount() {
        return  dynamicModels.size();
    }
    /**
     * :
     * @return获取位于数据集中指定位置的数据项。
     */
    @Override
    public DynamicItemInfo getItem(int i) {
        return dynamicModels.get(i);
    }
    /**
     * :
     * @return 获取数据集中指定位置的数据项的行ID。
     */
    @Override
    public long getItemId(int i) {
        return i;
    }

    /**
     * 获取在数据集中指定位置显示数据的组件。
     * @param i  指示组件在数据集中的位置。
     * @param component  表示前一个需要重用的组件。如果没有这样的组件,这个参数可以为空。
     * @param componentContainer  匹配要获取组件的父组件。
     * @return
     */
    @Override
    public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
      Component parse = component; //默认 component ==null 第一次的时候

        /**
         * LayoutScatter
         * 您可以使用该工具在XML文件中定义一个组件,
         * 然后调用parse(int, ohos.agp.components.ComponentContainer, boolean)
         * 方法来使用该文件生成一个组件对象。
         * parse 公共组件解析(int xmlId, ComponentContainer根,boolean attachToRoot)
         * 将XML文件转换为组件。
         *
         */
        /**
         * parse
         *   参数1 组件id
         *   参数2 跟组件 就是当前容器 父组件。
         */
        Dynamicitem dynamicitem;//初始化
        if (parse==null){
            //获取上下文 这里获取的是父组件 就是 ListContainer 上下文
            Context context = componentContainer.getContext();
            //获取xml 布局模板
            parse  = LayoutScatter.getInstance(context)
                    .parse(ResourceTable.Layout_dynamicitem, componentContainer, false);
            //指明给哪个模板容器添加数据
            dynamicitem = new Dynamicitem(parse);
            parse.setTag(dynamicitem);//将布局模板写入缓存  下次调用使用 不用重复查询模板
        }else {
            //第二次进来有缓存
            dynamicitem =(Dynamicitem) parse.getTag();
        }
        //给布局模板里面的组件添加数据
        dynamicitem.textAUTH.setText(dynamicModels.get(i).getAuthor());
        //绑定完成 返回当前模板
        return parse;
    }
    /**
     * 动态卡片容器
     */
    public  static   class Dynamicitem {
        Text textAUTH;//初始化组件
        Dynamicitem(Component itemComponent){
            //获取模板里面的 组件
            textAUTH = (Text) itemComponent.findComponentById(ResourceTable.Id_authname);
        }
    }
}
  1. 创建数据实体类

    package com.example.myapplication2048.datamodel;
    
    /**
     * 动态数据模型
     */
    public class DynamicItemInfo {
     // true 关注  false 没关注
     private boolean isFocusOn;
     //用户名
     private String author;
     //用户头像
     private String authorImgUrl;
     //创建时间
     private Long create_date;
     // true 点赞  false 没点赞
     private boolean isPraise;
     //点赞数量
     private Integer praiseNum;
     //评论数量
     private Integer commentsNum;
     //热度数量
     private Integer hotNum;
    
     public DynamicItemInfo(boolean isFocusOn, String author, String authorImgUrl, Long create_date, boolean isPraise, Integer praiseNum, Integer commentsNum, Integer hotNum) {
         this.isFocusOn = isFocusOn;
         this.author = author;
         this.authorImgUrl = authorImgUrl;
         this.create_date = create_date;
         this.isPraise = isPraise;
         this.praiseNum = praiseNum;
         this.commentsNum = commentsNum;
         this.hotNum = hotNum;
     }
    
     @Override
     public String toString() {
         return "dynamicModel{" +
                 "isFocusOn=" + isFocusOn +
                 ", author='" + author + '\'' +
                 ", authorImgUrl='" + authorImgUrl + '\'' +
                 ", create_date=" + create_date +
                 ", isPraise=" + isPraise +
                 ", praiseNum=" + praiseNum +
                 ", commentsNum=" + commentsNum +
                 ", hotNum=" + hotNum +
                 '}';
     }
    
     public boolean isFocusOn() {
         return isFocusOn;
     }
    
     public void setFocusOn(boolean focusOn) {
         isFocusOn = focusOn;
     }
    
     public String getAuthor() {
         return author;
     }
    
     public void setAuthor(String author) {
         this.author = author;
     }
    
     public String getAuthorImgUrl() {
         return authorImgUrl;
     }
    
     public void setAuthorImgUrl(String authorImgUrl) {
         this.authorImgUrl = authorImgUrl;
     }
    
     public Long getCreate_date() {
         return create_date;
     }
    
     public void setCreate_date(Long create_date) {
         this.create_date = create_date;
     }
    
     public boolean isPraise() {
         return isPraise;
     }
    
     public void setPraise(boolean praise) {
         isPraise = praise;
     }
    
     public Integer getPraiseNum() {
         return praiseNum;
     }
    
     public void setPraiseNum(Integer praiseNum) {
         this.praiseNum = praiseNum;
     }
    
     public Integer getCommentsNum() {
         return commentsNum;
     }
    
     public void setCommentsNum(Integer commentsNum) {
         this.commentsNum = commentsNum;
     }
    
     public Integer getHotNum() {
         return hotNum;
     }
    
     public void setHotNum(Integer hotNum) {
         this.hotNum = hotNum;
     }
    }
  2. 创建数据模板

    package com.example.myapplication2048.datamodel;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.IntStream;
    
    public class DynamicViewModel {
     private List<DynamicItemInfo> dataItemList = new ArrayList<>();
    
     public DynamicViewModel() {
         IntStream.range(0,2)
                 .forEach(index->dataItemList.add(
                         new DynamicItemInfo(false,"蓝天","adfa",123123L  ,true,12,12,2)));
     }
     public List<DynamicItemInfo> getDataItemList() {
         return dataItemList;
     }
    }
  3. 获取listContainer 并且绑定数据模板

    本案例这串代码需要写在 MainAbilitySlice 生命周期的 onStart 在子页面刚加载的时候调用即可

    //获取listContainer
     ListContainer listContainerDynamic =(ListContainer)  findComponentById(ResourceTable.Id_list_container);
           //实例化数据模板
         DynamicViewModel viewModel = new DynamicViewModel();
         //获取模板数组
         List<DynamicItemInfo> dataItemList = viewModel.getDataItemList();
           //模板数组传入数据提供者实体类
         DynamicProvider dynamicProvider = new DynamicProvider(dataItemList);
         //将数据提供者与listContaienr 绑定
         listContainerDynamic.setItemProvider(dynamicProvider);

    作者:BLUESKYHOST
    想了解更多内容,请访问51CTO和华为合作共建的鸿蒙社区:https://harmonyos.51cto.com/

21_9.jpg

推荐阅读
关注数
3010
内容数
446
华为鸿蒙相关技术,活动及资讯,欢迎关注及加入创作
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息