列表组件list-view的使用、flex布局教程,以APICloud AVM框架为例

简介: avm.js是 APICloud 推出的多端开发框架。使用 avm.js 一个技术栈可同时开发 Android & iOS 原生 App、小程序和 iOS 轻 App,且多端渲染效果统一;全新的 App 引擎 3.0 不依赖 webView,提供百分百的原生渲染,保障 App 性能和体验与原生 App 一致。

avm.js是 APICloud 推出的多端开发框架。使用 avm.js 一个技术栈可同时开发 Android & iOS 原生 App、小程序和 iOS 轻 App,且多端渲染效果统一;全新的 App 引擎 3.0 不依赖 webView,提供百分百的原生渲染,保障 App 性能和体验与原生 App 一致。

list-view 定义可复用内容的竖向滚动视图,可以优化内存占用和渲染性能,支持下拉刷新和上拉加载。可使用 scroll-view 的基本属性。

list-view 里面可放置 cell、list-header、list-footer、refresh 等组件,使用 cell 组件作为每项显示内容。

下面看一个 list-view 的示例:

<template>
  <list-view id="listView" class="main" enable-back-to-top onscrolltolower={this.onscrolltolower}>
    <cell class="cell c-lc-rl_ac c-sy-border_bottom c-lc-ptb" onclick={this.itemClick}>
      <img class="img" src={item.url} alt="">
      <text class="title c-filling-w c-pl">{item.title}</text>
    </cell>
    <list-footer class="footer">
      <text>加载中...</text>
    </list-footer>
  </list-view></template><style src='../../css/c-layout-mini.css' scoped></style><style>.main { width: 100%;  height: 100%;
}.cell {  width: 100%;  height: 70px;
}.img { height: 50px; width: 50px;  margin-left: 10px;
}.title { height: 50px; font-size: 20px;  line-height: 50px;
}.footer {  justify-content: center;  align-items: center;
}</style><script>export default { name: 'test', methods: {
    apiready() {      this.initData(false);
    },
    initData(loadMore) {      var that = this;      var skip = that.dataList ? that.dataList.length : 0;      var dataList = [];      for (var i = 0; i < 20; i++) {
        dataList[i] = {         title: '项目' + (i + skip),         url: '../../image/nav_tab_2.png'
        }
      }     var listView = document.getElementById('listView');     if (loadMore) {
        that.dataList = that.dataList.concat(dataList);
        listView.insert({         data: dataList
        });
      } else {
        that.dataList = dataList;
        listView.load({         data: dataList
        });
      }
    },
    onscrolltolower() {     this.initData(true);
    },
    itemClick(e) {
      api.alert({       msg: '当前项索引:' + e.currentTarget.index
      });
    }
  }
}</script>

list-view 只支持 APP,需要用自定义 loader 或 APPloader 调试。调试教程可查看文档 APICloud Studio3 WiFi 真机同步和 WiFi 真机预览使用说明

list-view 自带内存回收功能,可以滚动加载更多。

给 list****-view******** 添加下拉刷新组件 ****refresh

根据 refresh 组件文档,把 refresh 标签添加到 list-view 标签中,如下:

<template>
    <list-view id="listView" class="main" enable-back-to-top onscrolltolower={this.onscrolltolower}>
        <refresh class="refresh" state={refreshState} onstatechange={this.onstatechange}>
            <image class={refreshIconClass} src="../../image/refresh.png"></image>
            <image class={refreshLoadingClass} src="../../image/loading_more.gif"></image>
            <text class="refreshStateDesc">{refreshStateDesc}</text>
        </refresh>
    <cell class="cell c-lc-rl_ac c-sy-border_bottom c-lc-ptb" onclick={this.itemClick}>
            <img class="img" src={item.url} alt="">
            <text class="title c-filling-w c-pl">{item.title}</text>
        </cell>
        <list-footer class="footer">
            <text>加载中...</text>
        </list-footer>
    </list-view></template>

把 refresh 组件的 css ,js 代码也复制到相应的 style 和 script 标签中,并在项目目录 image 标签下添加用到的两张下拉刷新图片。完整代码如下:

<template>
    <list-view id="listView" class="main" enable-back-to-top onscrolltolower={this.onscrolltolower}>
        <refresh class="refresh" state={refreshState} onstatechange={this.onstatechange}>
            <image class={refreshIconClass} src="../../image/refresh.png"></image>
            <image class={refreshLoadingClass} src="../../image/loading_more.gif"></image>
            <text class="refreshStateDesc">{refreshStateDesc}</text>
        </refresh>
    <cell class="cell c-lc-rl_ac c-sy-border_bottom c-lc-ptb" onclick={this.itemClick}>
            <img class="img" src={item.url} alt="">
            <text class="title c-filling-w c-pl">{item.title}</text>
        </cell>
        <list-footer class="footer">
            <text>加载中...</text>
        </list-footer>
    </list-view></template><style  src='../../css/c-layout-mini.css' scoped></style><style>.main {  width: 100%;  height: 100%;
}.cell{ width: 100%;  height: 70px;
}.img{  height: 50px; width: 50px;  margin-left: 10px;  
}.title { height: 50px; font-size: 20px;  line-height: 50px;
}  .footer {        justify-content: center;        align-items: center;
    } .refresh {        align-items: center;        justify-content: center;        background-color: #eee;
    }    .refreshStateDesc {        color: #e3007f;        font-size: 13px;
    }    .refreshIcon {        position: absolute;        width: 25px;        height: 22px;        bottom: 21px;        left: 70px;        transition-property: transform;        transition-duration: 100ms;
    }    .refreshIcon-normal {        transform: rotate(0);        visibility: visible;
    }    .refreshIcon-dragging {        transform: rotate(180deg);        visibility: visible;
    }    .refreshIcon-refreshing {        visibility: hidden;
    }    .refreshLoading {        position: absolute;        width: 22px;        height: 22px;        bottom: 21px;        left: 70px;        visibility: hidden;
    }    .refreshLoading-refreshing {        visibility: visible;
    }</style><script>
    export default {        name: 'test',
     data(){            return {                refreshState: 'normal'
            }
        },    computed: {
            refreshIconClass(){                if (this.data.refreshState == 'normal') {                    return 'refreshIcon refreshIcon-normal';
                } else if (this.data.refreshState == 'dragging') {                    return 'refreshIcon refreshIcon-dragging';
                } else if (this.data.refreshState == 'refreshing') {                    return 'refreshIcon refreshIcon-refreshing';
                }
            },
            refreshLoadingClass() {                if (this.data.refreshState == 'refreshing') {                    return 'refreshLoading refreshLoading-refreshing';
                } else {                    return 'refreshLoading';
                }
            },
            refreshStateDesc() {                if (this.data.refreshState == 'normal') {                    return '下拉可以刷新';
                } else if (this.data.refreshState == 'dragging') {                    return '松开可以刷新';
                } else if (this.data.refreshState == 'refreshing') {                    return '刷新中...';
                }
            }
        },        methods:{
            apiready() {                this.initData(false);
            },
            initData(loadMore) {                var that = this;                var skip = that.dataList?that.dataList.length:0;                var dataList = [];                for (var i=0;i<20;i++) {
                    dataList[i] = {                        title: '项目' + (i + skip),                        url: '../../image/nav_tab_2.png'
                    }
                }                var listView = document.getElementById('listView');                if (loadMore) {
                    that.dataList = that.dataList.concat(dataList);
                    listView.insert({                        data: dataList
                    });
                } else {
                    that.dataList = dataList;
                    listView.load({                        data: dataList
                    });
                }
            },
            onscrolltolower() {                this.initData(true);
            },
            itemClick(e) {
                api.alert({                    msg: '当前项索引:' + e.currentTarget.index
                });
            },
      onstatechange(e) {                var state = e.detail.state;                if (state == 'normal') {                    this.data.refreshState = 'normal';
                } else if (state == 'dragging') {                    this.data.refreshState = 'dragging';
                } else if (state == 'refreshing') {                    this.data.refreshState = 'refreshing';                    var that = this;
                    setTimeout(function(){
                        that.data.refreshState = 'normal';
                    }, 2000);
                }
            }
        }
    }</script>


Flex 布局介绍:

Flex 布局意思是弹性盒子布局,比较适合移动端场景,可以自动伸缩适配不同屏幕大小。

<div>

  <div>item</div>

  <div>item</div>

  <div>item</div>

</div>

通常可以把父元素定义为弹性盒子或称为容器,其子元素为弹性盒子的项目。flex 布局的主要功能是在主轴或交叉轴按预期排列分布项目,定义每个项目占用空间比例,并可跟随容器大小伸缩。


APICloud-专业APP开发app定制服务商,提供一站式移动应用解决方案,满足您的各类需求,欢迎免费评估需求和获取报价。

立即免费在线制作一个APP,新手注册即送开发大礼包

提交app定制需求,免费获取报价和周期:

电脑请点击https://app.apicloud.com/index?uzchannel=500

手机请点击https://www.apicloud.com/m/customizedservice


目录
相关文章
|
1月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
120 1
|
1月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
239 1
|
5月前
|
设计模式 容器
13.HarmonyOS流式卡片列表实现指南:Flex多行布局详解
在现代移动应用开发中,流式卡片列表是一种常见且实用的UI设计模式。它能够自适应屏幕宽度,在有限空间内高效展示多个内容项。本教程将详细讲解如何使用HarmonyOS的ArkUI框架中的Flex组件实现一个灵活的流式卡片列表,重点关注多行布局与对齐策略的应用。
201 2
|
5月前
|
开发者 UED 容器
07.精通HarmonyOS Flex对齐:从基础到高级布局技巧(上)
在HarmonyOS Next的ArkUI框架中,Flex容器提供了强大而灵活的对齐系统,使开发者能够精确控制子元素在容器中的排列方式。掌握这些对齐技术,是构建专业级用户界面的关键。
198 0
|
5月前
|
UED 容器
5.HarmonyOS Next开发宝典:掌握Flex布局的艺术
Flex布局(弹性布局)是HarmonyOS Next中最强大的布局方式之一,它提供了一种更加高效、灵活的方式来对容器中的子元素进行排列、对齐和分配空间。无论是简单的居中显示,还是复杂的自适应界面,Flex布局都能轻松应对。
214 0
|
5月前
|
UED 容器
10.HarmonyOS Next布局进阶:嵌套Flex容器与空间分配策略
在HarmonyOS Next的ArkUI框架中,Flex布局是构建用户界面的核心技术之一。通过嵌套使用Flex容器,我们可以创建复杂而灵活的界面结构,满足各种应用场景的需求。本教程将深入探讨如何在HarmonyOS Next中使用嵌套Flex容器实现复杂布局,以及如何合理分配和控制空间。
164 0
|
8月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
585 1
Java 中数组Array和列表List的转换
|
8月前
|
开发者 容器
鸿蒙开发:弹性布局Flex
在实际的开发中,需要掌握主轴与交叉轴的关系、换行规则及子元素属性,同时注意性能与兼容性问题,还有一点,Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。
237 10
鸿蒙开发:弹性布局Flex
|
前端开发 容器
flex布局
【10月更文挑战第7天】
286 87
|
前端开发 UED 容器
使用 Flex 布局实现垂直居中效果
【10月更文挑战第7天】
1301 57

热门文章

最新文章