鸿蒙「3.4熟知的列表」闯荡HAP之单-列表和组装列表

想了解更多内容,请访问:

创新互联建站-专业网站定制、快速模板网站建设、高性价比徐闻网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式徐闻网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖徐闻地区。费用合理售后完善,10余年实体公司更值得信赖。

和华为官方合作共建的鸿蒙技术社区

https://harmonyos./#zz

  • 在一个文件夹里会罗列出很多个子文件夹或者文件,包含文件名、文件大小、文件修改日期、文件类型等;
  • 在一个内容网站里会罗列出很多条内容,或许还要翻页,包含文章标题、文章作者、发表时间、浏览量等;
  • 在一个图册网站,里面会罗列出很多图集或者图片,包含图集名称、图集作者等;
  • 在一个音乐播放器的具体某类歌曲中,会罗列出很多歌曲,包含歌名、作者、所属歌集、时长等;

还有很多想类似的情况,这里就不一一列举了。通过上面四个场景,我们可以发现一个共同的特点,它们都有很多条数据,每个场景中数据的属性是相同的。这就让我想起了在学习Java 的数组时,对于一维数组,其元素的类型是相同的,你不可能定义了一个整形的数组,向里面添加了字符串类型的元素,这是不行的。假如我们需要做一个新闻类的展示界面,那么我们的数据中,每个元素中的属性必须是一样的。比如我们的元素属性包含标题、作者、内容摘要、封面图、发布时间、浏览记录、点赞量、评论量,但是在这个列表中存在一个特殊的元素,它的属性为歌曲名称、作者、歌集、时长,那么我们在展示这个数据集的时候,会出现什么问题呢(这里不做详细说明了,也许你已经知道答案是什么了)?

对于ListContainer组件的理论不在这里做赘述了,官文已经说得很明白了,本节将结合OkHttp插件,来使用ListContainer组件做一个简单的新闻展示Demo。

在开始复杂的列表展示页之前,我们先来做一个简单的列表展示,在学习Android的时候,列表有个展示水果的示例,我将在HarmonyOS智慧屏上实现这个小示例。

一、单一的列表

1、在layout目录下新建fruit_layout.xml文件,并创建ListContainer组件,代码如下:

 
 
 
 
  1.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  2.     ohos:height="match_parent"
  3.     ohos:width="match_parent"
  4.     ohos:orientation="vertical">
  5.     
  6.         ohos:id="$+id:fruit_list"
  7.         ohos:height="match_parent"
  8.         ohos:width="match_parent"
  9.         ohos:layout_alignment="horizontal_center"/>

 2、接着在layout目录新建element_layout.xml文件,作为ListContainer组件的子布局,代码如下:

 
 
 
 
  1.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  2.     ohos:height="match_content"
  3.     ohos:width="match_parent"
  4.     ohos:background_element="$graphic:background_element"
  5.     ohos:bottom_margin="4vp"
  6.     ohos:orientation="vertical">
  7.     
  8.         ohos:id="$+id:element_index"
  9.         ohos:height="match_content"
  10.         ohos:width="match_content"
  11.         ohos:padding="4vp"
  12.         ohos:text_size="30fp"
  13.         ohos:layout_alignment="center"/>

 3、组建一个类型为String的List列表,最终呈现在UI界面上。

 
 
 
 
  1. List fruits = new ArrayList<>();
  2.    fruits.add("苹果");
  3.    fruits.add("橘子");
  4.    fruits.add("橙子");
  5.    fruits.add("香蕉");
  6.    fruits.add("梨");
  7.    fruits.add("桃子");
  8.    fruits.add("苹果梨");
  9.    fruits.add("香蕉梨");
  10.    fruits.add("冬桃");
  11.    fruits.add("红葡萄");
  12.    fruits.add("紫葡萄");
  13.    fruits.add("黑葡萄");

 4、ListContainer组件的每一行元素可以是不相同的数据,因此需要适配不同的数据结构,使其能够添加到ListContainer组件中,并以列表的形式呈现在UI界面上。ListContainer组件提供了setItemProvider​(BaseItemProvider itemProvider)方法,用于设置要显示的ListContainer组件对象。创建FruitElementProvider类,并继承BaseItemProvider,重写其中的方法。

 
 
 
 
  1. package com.ming.harmonyos.newsapp.domain;
  2. import com.ming.harmonyos.newsapp.ResourceTable;
  3. import ohos.aafwk.ability.AbilitySlice;
  4. import ohos.agp.components.*;
  5. import java.util.List;
  6. public class FruitElementProvider extends BaseItemProvider {
  7.     private List list;
  8.     private AbilitySlice slice;
  9.     public FruitElementProvider(List fruits, AbilitySlice slice) {
  10.         this.list = fruits;
  11.         this.slice = slice;
  12.     }
  13.     @Override
  14.     public int getCount() {
  15.         return list.size();
  16.     }
  17.     @Override
  18.     public Object getItem(int i) {
  19.         return list.get(i);
  20.     }
  21.     @Override
  22.     public long getItemId(int i) {
  23.         return i;
  24.     }
  25.     @Override
  26.     public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
  27.         Component cpt = component;
  28.         if (cpt == null) {
  29.             cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_element_layout, null, false);
  30.         }
  31.         String fruit = list.get(i);
  32.         Text text = (Text) cpt.findComponentById(ResourceTable.Id_element_index);
  33.         text.setText(fruit);
  34.         return cpt;
  35.     }
  36. }

 5、在MainAbility中适配ListContainer的数据结构,并添加点击事件。

 
 
 
 
  1. ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_fruit_list);
  2.        List fruits = new ArrayList<>();
  3.        fruits.add("苹果");
  4.        fruits.add("橘子");
  5.        fruits.add("橙子");
  6.        fruits.add("香蕉");
  7.        fruits.add("梨");
  8.        fruits.add("桃子");
  9.        fruits.add("苹果梨");
  10.        fruits.add("香蕉梨");
  11.        fruits.add("冬桃");
  12.        fruits.add("红葡萄");
  13.        fruits.add("紫葡萄");
  14.        fruits.add("黑葡萄");
  15.        FruitElementProvider fruitElementProvider = new FruitElementProvider(fruits, this);
  16.        listContainer.setItemProvider(fruitElementProvider);
  17.        listContainer.setItemClickedListener((listContainer1, component, position, id) -> {
  18.            String item = (String) listContainer1.getItemProvider().getItem(position);
  19.            new ToastDialog(getContext())
  20.                    .setText("点击了:" + item)
  21.                    // Toast显示在界面中间
  22.                    .setAlignment(LayoutAlignment.CENTER)
  23.                    .show();
  24.        });

 6、运行查看效果。

二、组合复杂的列表

1、和单一列表不同之处在于元素的显示和元素的属性。单一列表中我使用了一个List ,复杂的列表中,我将根据请求API接口返回的数据类型进行数据结构的组装。在这之前我先要说说OkHttp如何引入,以及需要授予那些权限。

1)首先我们在build.gradle中引入OkHttp(本节并不是对OkHttp做详细讲解,这里只是简单的使用)的版本,并点击窗口上的Sync Now进行同步下载。

 
 
 
 
  1. implementation("com.squareup.okhttp3:okhttp:4.9.0")

2)在config.json中配置INTENT权限。

 
 
 
 
  1. "reqPermissions": [
  2.       {
  3.         "name": "ohos.permission.INTERNET",
  4.         "usedScene": {
  5.           "ability": [
  6.             "com.ming.harmonyos.newsapp.MainAbility"
  7.           ],
  8.           "when": "always"
  9.         }
  10.       }
  11.     ]

 3)在MainAbilitySlice中实例化OkHttpClient对象,并封装它的GET调用方法。

 
 
 
 
  1. private OkHttpClient client = new OkHttpClient();
  2.    private String run(String url) throws IOException {
  3.        Request request = new Request.Builder()
  4.                .url(url)
  5.                .build();
  6.        try (Response response = client.newCall(request).execute()) {
  7.            return response.body().string();
  8.        }
  9.    }

 2、做好上面的准备之后,我使用天行数据的每日简报API接口。先看一下调用接口返回的参数:

3、我们根据返回的参数来构建我们的列表元素类。

 
 
 
 
  1. public class News {
  2.     //新闻标题
  3.     private String title;
  4.     //简报内容
  5.     private String digest;
  6.     //简报封面
  7.     private String imgsrc;
  8.     //简报链接
  9.     private String url;
  10.     //简报来源
  11.     private String source;
  12.     //新闻时间
  13.     private String mtime;
  14.    //getter & setter
  15. }

 4、在layout目录新建news_element_layout.xml文件,作为ListContainer组件的子布局,代码如下:

 
 
 
 
  1.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  2.     ohos:height="match_content"
  3.     ohos:width="match_parent"
  4.     ohos:bottom_margin="4vp"
  5.     ohos:orientation="vertical">
  6.     
  7.         ohos:height="match_parent"
  8.         ohos:width="match_parent"
  9.         ohos:background_element="$graphic:background_element"
  10.         ohos:orientation="horizontal">
  11.         
  12.             ohos:id="$+id:news_imgsrc"
  13.             ohos:image_src="$media:icon"
  14.             ohos:height="100vp"
  15.             ohos:width="100vp"/>
  16.         
  17.             ohos:height="match_parent"
  18.             ohos:width="match_parent">
  19.             
  20.                 ohos:id="$+id:news_title"
  21.                 ohos:height="match_parent"
  22.                 ohos:width="match_parent"
  23.                 ohos:weight="1"
  24.                 ohos:text="我是标题"
  25.                 ohos:text_size="20fp"/>
  26.             
  27.                 ohos:id="$+id:news_remark"
  28.                 ohos:height="match_parent"
  29.                 ohos:width="match_parent"
  30.                 ohos:weight="1"
  31.                 ohos:text="我是摘要"
  32.                 ohos:text_size="14fp"
  33.                 ohos:multiple_lines="true"
  34.                 ohos:max_text_lines="2"
  35.                 ohos:text_color="#888888"/>
  36.             
  37.                 ohos:height="match_parent"
  38.                 ohos:width="match_parent"
  39.                 ohos:weight="1">
  40.                 
  41.                     ohos:id="$+id:news_source"
  42.                     ohos:height="match_content"
  43.                     ohos:width="match_content"
  44.                     ohos:text="来源"
  45.                     ohos:text_size="12fp"
  46.                     ohos:text_color="#CCCCCC"
  47.                     ohos:align_parent_left="true"/>
  48.                 
  49.                     ohos:id="$+id:news_time"
  50.                     ohos:height="match_content"
  51.                     ohos:width="match_content"
  52.                     ohos:text="时间"
  53.                     ohos:text_size="12fp"
  54.                     ohos:text_color="#CCCCCC"
  55.                     ohos:right_padding="20vp"
  56.                     ohos:align_parent_right="true"/>
  57.             
  58.         
  59.     

 5、创建NewsItemProvider类,并继承BaseItemProvider,重写其中的方法。

 
 
 
 
  1. @Override
  2.   public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
  3.       Component cpt = component;
  4.       if (cpt == null) {
  5.           cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_news_element_layout, null, false);
  6.       }
  7.       News news = list.get(i);
  8.       //封面图
  9.       Image image = (Image) cpt.findComponentById(ResourceTable.Id_news_imgsrc);
  10.       
  11.       //标题
  12.       Text title = (Text) cpt.findComponentById(ResourceTable.Id_news_title);
  13.       title.setText(news.getTitle());
  14.       //摘要
  15.       Text remark = (Text) cpt.findComponentById(ResourceTable.Id_news_remark);
  16.       remark.setText(news.getDigest());
  17.       //来源
  18.       Text source = (Text) cpt.findComponentById(ResourceTable.Id_news_source);
  19.       source.setText(news.getSource());
  20.       //日期
  21.       Text time = (Text) cpt.findComponentById(ResourceTable.Id_news_time);
  22.       time.setText(news.getMtime());
  23.       return cpt;
  24.   }

 6、在MainAbility中使用OkHttp获取数据并适配ListContainer的数据结构,最后查看运行效果。

 
 
 
 
  1. /**
  2.     * 复杂数据结构
  3.     */
  4.    private void initNewsListContainer() {
  5.        //在子线程中获取数据
  6.        new Thread(new Runnable() {
  7.            @Override
  8.            public void run() {
  9.                try {
  10.                    String response = MainAbilitySlice.this.run("https://api.tianapi.com/bulletin/index?key=您自己的KEY");
  11.                    System.out.println(response);
  12.                    JSONObject jsonObject = JSONObject.parseObject(response);
  13.                    int code = Integer.valueOf(String.valueOf(jsonObject.get("code")));
  14.                    String message = String.valueOf(jsonObject.get("msg"));
  15.                    String data = String.valueOf(jsonObject.get("newslist"));
  16.                    if (code == 200) {
  17.                        List list = JSONArray.parseArray(data, News.class);
  18.                        ListContainer news = (ListContainer) findComponentById(ResourceTable.Id_news_list);
  19.                        NewsItemProvider nip = new NewsItemProvider(list, MainAbilitySlice.this);
  20.                        news.setItemProvider(nip);
  21.                    } else {
  22.                        new ToastDialog(getContext())
  23.                                .setText("抛出异常信息: " + message)
  24.                                .setAlignment(LayoutAlignment.CENTER)
  25.                                .show();
  26.                    }
  27.                } catch (Exception e) {
  28.                    e.printStackTrace();
  29.                }
  30.            }
  31.        }).start();
  32.    }

我的HarmonyOS GitHub库

©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任

想了解更多内容,请访问:

和华为官方合作共建的鸿蒙技术社区

https://harmonyos./#zz

本文题目:鸿蒙「3.4熟知的列表」闯荡HAP之单-列表和组装列表
地址分享:http://www.shufengxianlan.com/qtweb/news43/165893.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联