鸿蒙开发(14)---ListContainer列表组件

简介: 鸿蒙开发(14)---ListContainer列表组件

ListContainer列表组件


在实际的App开发中,我们最最最常用的其实就是列表组件。在Android中,它是ListView与recyclerview。在鸿蒙中,它是ListContainer。


下面,我们将详细介绍ListContainer组件的使用方式。


基本用法

在我们创建使用ListContainer组件时,我们一般通过4个步骤进行创建。


创建ListContainer组件

首先,我们需要在XML布局文件定义一个ListContainer组件。示例如下:

<ListContainer
    ohos:id="$+id:test_listcontainer"
    ohos:height="match_content"
    ohos:width="match_parent"
    ohos:layout_alignment="center"/>


创建数据实体类

第2步,我们需要创建一个实体类模型,用于定义需要使用的列表数据。比如我们资讯类App的实体类有标题,简介,图片等。都可以通过实体类进行定义。


示例如下:

public class MyNews {
    private String title;
    private String desc;
    public MyNews(String title,String desc) {
        this.title = title;
        this.desc=desc;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
}


这里图片就先省略,只使用标题与描述两个变量。至于图片的获取,我们将在鸿蒙的网络编程章节详细讲解,这里展示跳过。


定义适配器

第3步,我们需要定义适配器。


在鸿蒙中,适配器是继承的BaseItemProvider。你可以把它类比为Android中的Adapter的子类(比如ArrayAdapter等)。示例如下:

public class MyNewsProvider extends BaseItemProvider {
    private List<MyNews> myNewsList;
    private AbilitySlice abilitySlice;
    public MyNewsProvider(List<MyNews> myNewsList,AbilitySlice abilitySlice){
        this.myNewsList=myNewsList;
        this.abilitySlice=abilitySlice;
    }
    @Override
    public int getCount() {
        return myNewsList == null ? 0 : myNewsList.size();
    }
    @Override
    public Object getItem(int i) {
        if (myNewsList != null && i >= 0 && i < myNewsList.size()){
            return myNewsList.get(i);
        }
        return null;
    }
    @Override
    public long getItemId(int i) {
        return i;
    }
    @Override
    public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
        final Component cpt;
        if (component == null) {
            cpt = LayoutScatter.getInstance(this.abilitySlice).parse(ResourceTable.Layout_list_container_item, null, false);
        } else {
            cpt = component;
        }
        MyNews myNewsItem = this.myNewsList.get(i);
        Text title = (Text) cpt.findComponentById(ResourceTable.Id_list_title);
        title.setText(myNewsItem.getTitle());
        Text desc = (Text) cpt.findComponentById(ResourceTable.Id_list_desc);
        desc.setText(myNewsItem.getDesc());
        return cpt;
    }
}


在使用上面的适配器之前,我们还需要定义一个名叫list_container_item的,ListContainer子项的布局文件。list_container_item.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">
    <Text
        ohos:id="$+id:list_title"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:text_color="#FF0000"
        ohos:layout_alignment="center"/>
    <Text
        ohos:id="$+id:list_desc"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="30vp"
        ohos:text_color="#0000FF"
        ohos:layout_alignment="center"/>
    <Image
        ohos:height="1vp"
        ohos:width="match_parent"
        ohos:background_element="#00FF00"/>
</DirectionalLayout>


这里,我们定义了2个Text,一个用于显示标题,一个用于显示描述。不过,前面讲解Image组件时并没有讲解到分割线的引用。


其实Image不设置图片,直接设置高度与颜色,是可以创建分割线的。


将数据添加到ListContainer组件

话不多说,最后,我们需要将值赋予ListContainer组件,才算创建成功。代码如下:

public class MainAbilitySlice extends AbilitySlice{
    private ListContainer listContainer;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        this.listContainer=(ListContainer)findComponentById(ResourceTable.Id_test_listcontainer);
        List<MyNews> list = getData();
        MyNewsProvider myNewsProvider = new MyNewsProvider(list, this);
        listContainer.setItemProvider(myNewsProvider);
    }
    private List<MyNews> getData(){
        List<MyNews> myNewsList=new ArrayList<>();
        for (int i = 0; i <= 20; i++) {
            myNewsList.add(new MyNews("Item" + (i),"desc"+(i)));
        }
        return myNewsList;
    }
}


运行之后,效果如下所示:


横向ListContainer

在实际的列表中,我们还会使用到横向的列表,比如某些视频App,其横向的视频推荐可以看到很多。那么如果改变ListContainer组件的默认方向呢?


示例代码如下:

this.listContainer.setOrientation(Component.HORIZONTAL);

当然,你也可以直接在XML布局文件中设置orientation属性。效果如下:


需要注意的是,横向的ListView就不要把顶级的宽高设置成match_parent,这样会造成横向屏幕中只有一个子item。应该改为match_content。并且,设置margin边距。不过横向一般没有下划线,可以通过修改子item的布局(list_container_item)进行去除。

相关文章
|
24天前
|
JavaScript 安全 前端开发
【HarmonyOS开发】ArkTS基础语法及使用(鸿蒙开发基础教程)
【HarmonyOS开发】ArkTS基础语法及使用(鸿蒙开发基础教程)
279 4
|
24天前
|
存储 数据安全/隐私保护
鸿蒙开发:自定义一个动态输入框
在鸿蒙开发中,如何实现这一效果呢,最重要的解决两个问题,第一个问题是,如何在上一个输入框输入完之后,焦点切换至下一个输入框中,第二个问题是,如何禁止已经输入的输入框的焦点,两个问题解决完之后,其他的就很是简单了。
48 13
鸿蒙开发:自定义一个动态输入框
|
27天前
|
小程序 测试技术 API
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
本文详细介绍元服务的开发及上架全流程,涵盖元服务的特点、创建项目、服务卡片、签名打包、开发测试及上架审核等环节,帮助开发者轻松掌握从零开始开发并发布元服务的全过程。元服务以其轻量、免安装、易于使用等特点,成为未来服务提供的重要形式。
71 13
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
|
27天前
|
前端开发 搜索推荐 开发者
「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图
Canvas 组件在鸿蒙应用中用于绘制自定义图形,提供丰富的绘制功能和灵活的定制能力。通过 Canvas,可以创建矩形、圆形、路径、文本等基础图形,为鸿蒙应用增添个性化的视觉效果。本篇将介绍 Canvas 组件的基础操作,涵盖绘制矩形、圆形、路径和文本的实例。
62 12
「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图
|
27天前
|
搜索推荐 前端开发 开发者
「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现
自定义动画让开发者可以设计更加个性化和复杂的动画效果,适合表现独特的界面元素。鸿蒙提供了丰富的工具,支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。
72 11
「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现
|
23天前
|
UED
「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件
本篇将带你实现一个自定义评分星级组件,用户可以通过点击星星进行评分,并实时显示评分结果。为了让界面更具吸引力,我们还将添加一只小猫图片作为评分的背景装饰。
63 6
「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件
|
25天前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
在鸿蒙应用开发中,Canvas 组件不仅用于基础绘图,还提供了处理复杂路径和渐变效果的多种手段,帮助开发者实现精美的静态图形。本篇将介绍如何在 Canvas 中绘制复杂路径、创建渐变填充效果。
44 7
「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
|
25天前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas 组件的动态进阶应用
在鸿蒙应用中,Canvas 组件可以实现丰富的动态效果,适合用于动画和实时更新的场景。本篇将介绍如何在 Canvas 中实现动画循环、动态进度条、旋转和缩放动画,以及性能优化策略。
45 6
「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas 组件的动态进阶应用
|
25天前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用
自定义组件可以帮助开发者实现复用性强、逻辑清晰的界面模块。通过自定义组件,鸿蒙应用能够提高代码的可维护性,并简化复杂布局的构建。本篇将介绍如何创建自定义组件,如何向组件传递数据,以及如何在不同页面间复用这些组件。
35 5
「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用
|
1天前
|
索引
鸿蒙开发:ForEach中为什么键值生成函数很重要
在列表组件使用的时候,如List、Grid、WaterFlow等,循环渲染时都会使用到ForEach或者LazyForEach,当然了,也有单独使用的场景,如下,一个很简单的列表组件使用,这种使用方式,在官方的很多案例中也多次出现,相信在实际的开发中多多少少也会存在。
鸿蒙开发:ForEach中为什么键值生成函数很重要