花粉乐分享平台宣传视频
> 华为资讯 > 华为资讯 > 鸿蒙编程 > 4.3「HarmonyOS鸿蒙开发」组件ListContainer(上)
4.3「HarmonyOS鸿蒙开发」组件ListContainer(上)
来源:RubyHan
2023-01-15 16:45:40
464
管理

作者:韩茹

公司:程序咖(北京)科技有限公司

鸿蒙巴士专栏作家

ListContainer是用来呈现连续、多行数据的组件,包含一系列相同类型的列表项。

MVC的设计模式br m:model:数据模型br data:数组,集合,。。。br V:view:视图br ListContainerbr c:control:控制器br Provider一、支持的XML属性

ListContainer的共有XML属性继承自:Component

ListContainer的自有XML属性见下表:

属性名称

中文描述

取值

取值说明

使用案例

rebound_effect

开启/关闭回弹效果

boolean类型

可以直接设置true/false,也可以引用boolean资源。

ohos:rebound_effect="true"ohos:rebound_effect="$boolean:true"

shader_color

着色器颜色

color类型

可以直接设置色值,也可以引用color资源。

ohos:shader_color="#A8FFFFFF"ohos:shader_color="$color:black"

orientation

列表项排列方向

horizontal

表示水平方向列表。

ohos:orientation="horizontal"

vertical

表示垂直方向列表。

ohos:orientation="vertical"

二、ListContainer的使用方法

我们先来说一下思路步骤:

使用ListContainerbr step1:先xml布局:控件ListContainerbr step2:对应的AbilitySlice中找到控件br step3:设置数据源br List,Array,Map等br step4:创建Providerbr 自定义类,继承BaseItemProvider,重写4个必要的方法。br step5:设置Provider,适配数据br step6:添加监听br OnItemClickListener

1、在xml布局文件中:

br

2、设置ListContainer的开始和结束偏移量。

listContainer.setContentOffSet(200,100);

java中的代码:

// 初始化ListContainer private void initListContainer(){ // 1.获取xml布局中的ListContainer组件 ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_list_container1); // 设置起始和结束位置的偏移量 listContainer.setContentOffSet(200,100); // 2.实例化数据源 ... }

设置列表容器的开始偏移量为100,结束偏移量为100,示例效果:

3、设置回弹效果。

在xml中设置:

在Java代码中设置:

listContainer.setReboundEffect(true);

回弹效果:

2、在layout目录下,新建一个布局文件:list_container_layout.xml

在这里我们放置了一个ListContainer,然后我们继续创建xml布局文件,用来表示每个item的布局,list_item_demo2.xml

2、然后我们在provider包下新建一个Provider:ListItemProvider.java文件:

package com.example.hanrulistcontainer.provider;import com.example.hanrulistcontainer.ResourceTable;import ohos.aafwk.ability.AbilitySlice;import ohos.agp.components.*;import java.util.List;import java.util.Map;public class ListItemProvider extends BaseItemProvider{ private List list; private AbilitySlice slice; public ListItemProvider(List list, AbilitySlice slice) { this.list = list; this.slice = slice; } @Override public int getCount() { return list == null?0: list.size();//一般返回数据源的长度 } @Override public Object getItem(int position) { if(list!= null && position >= 0 && position < list.size()){ return list.get(position); } return null; } @Override public long getItemId(int position) { return position; } @Override public Component getComponent(int position, Component convertComponent, ComponentContainer componentContainer) { final Component cpt; // 如果还没有convertComponent对象,那么将xml布局文件转为一个Component对象。 if(convertComponent == null){ //从当前的AbilitySlice对应的xml布局中, cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_list_item_demo2,null,false); }else{ cpt = convertComponent; } Map map =list.get(position);//获取数据 Text textName = (Text) cpt.findComponentById(ResourceTable.Id_text_name); Text textNote = (Text) cpt.findComponentById(ResourceTable.Id_text_note); Image image =(Image) cpt.findComponentById(ResourceTable.Id_image_icon); textName.setText((String)map.get("name")); textNote.setText((String)map.get("note")); image.setPixelMap((int)map.get("image")); return cpt; }}

3、slice包下新建一个AbilitySlice文件:SecondAbilitySlice.java

package com.example.hanrulistcontainer.slice;import com.example.hanrulistcontainer.ResourceTable;import com.example.hanrulistcontainer.provider.ListItemProvider;import ohos.aafwk.ability.AbilitySlice;import ohos.aafwk.content.Intent;import ohos.agp.components.ListContainer;import ohos.agp.utils.LayoutAlignment;import ohos.agp.window.dialog.ToastDialog;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class SecondAbilitySlice extends AbilitySlice{ @Override protected void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_list_container_layout); initListContainer(); } // 初始化ListContainer private void initListContainer(){ // 1.获取xml布局中的ListContainer组件 ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_list_container2); // 2.实例化数据源 List list = getData(); // 3.初始化Provider对象 ListItemProvider listItemProvider = new ListItemProvider(list,this); // 4.适配要展示的内容数据 listContainer.setItemProvider(listItemProvider); // 5.设置每个Item的点击事件 listContainer.setItemClickedListener((container, component, position, id) -> { Map item = (Map) listContainer.getItemProvider().getItem(position); new ToastDialog(this) .setText("你点击了:" item.get("name") "," item.get("note")) // Toast显示在界面中间 .setAlignment(LayoutAlignment.CENTER) .show(); }); } // 初始化数据源 private List getData(){ List list = new ArrayList(); // icon图标 int[] images = {ResourceTable.Media_image_info1,ResourceTable.Media_image_info2, ResourceTable.Media_image_info3,ResourceTable.Media_image_info4, ResourceTable.Media_image_info5,ResourceTable.Media_image_info6, ResourceTable.Media_image_info7,ResourceTable.Media_image_info8, ResourceTable.Media_image_info9,ResourceTable.Media_image_info10}; String[] names={"曹操","刘备","关羽","诸葛亮","小乔","貂蝉","吕布","赵云","黄盖","周瑜"}; String[] notes={"一代枭雄","卖草鞋","财神","卧龙先生","周瑜媳妇","四大镁铝","天下无双","常胜将军","愿意挨打","愿意打人"}; list= new ArrayList(); for(int i=0;i思路和之前讲原理的时候一样,这里我就不再赘述了。但是数据源的类型我换了一下,之前讲原理的时候使用的是自定义类ItemDemo,这里我直接使用了Map。

4、修改一下程序的入口:

public class MainAbility extends Ability { @Override public void onStart(Intent intent) { super.onStart(intent);// super.setMainRoute(MainAbilitySlice.class.getName()); super.setMainRoute(SecondAbilitySlice.class.getName()); }}

然后运行即可。

花粉社群VIP加油站

3
点赞
赏礼
赏钱
0
收藏
免责声明:本文仅代表作者个人观点,与花粉乐分享无关。其原创性以及文中陈述文字和内容未经本网证实,对本文以及其中全部或者 部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
凡本网注明 “来源:XXX(非花粉乐分享)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对 其真实性负责。
如因作品内容、版权和其它问题需要同本网联系的,请在一周内进行,以便我们及时处理。
QQ:2443165046 邮箱:info@hflfx.com
关于作者
黛末(采蜜高手)
文章
534
主题
0
关注
0
粉丝
0
点击领取今天的签到奖励!
签到排行
随手拍
54个圈友 0个话题
华为手机随手拍,记录生活点滴之美好
华为P30pro
51个圈友 0个话题
这里是华为P30pro手机交流圈,欢迎华为P30pro用户进群交流
体验官
60个圈友 2个话题
华为花粉体验官,体验官专属的交流群
登录后查看您创建的圈子
登录后查看您创建的圈子
所有圈子
杭州互联网违法和不良信息举报平台 网络110报警服务 浙ICP备17046585号
3
0
分享
请选择要切换的马甲:

个人中心

每日签到

我的消息

内容搜索