当然如果有配合 github 项目的代码来看的话,一定会发现我也已经将实现好的代码也更新上去了,可以作为实现参考。...addAutomaticKeepAlives 源码部分说明 简单来说(翻译一下),通常列表是懒惰的,将子类元素装在 AutomaticKeepAlive 中,以便其子级元素可以使用 KeepAliveNotification...cacheExtent 在视图可见区域之外有一个区域(即垂直是上下部分,水平是左右部分),用于缓存滚动即进入可见区域的子类。...以上就是 ListView 属性的使用说明了,但是你可能会问了,这些子元素你写那么多不现实啊,真正使用到的时候肯定都是按需生成的,不然如果有很多子元素不可能都 copy paste一遍吧?...例如:sliverchildDelegate 可以控制用于估计实际不可见子级大小的算法。 ListView.custom 要实现起来的话较为麻烦,但还是可以简单实现一下。
如果一个可滚动组件支持Sliver,那么该可滚动组件可以将子组件分成多个Sliver,只有当Sliver出现在视图窗口时才会去构建它,从而提高渲染的性能。...bool primary,//是否是与父级关联的主滚动视图 this.physics,//设置滚动效果 this.controller,//控制滚动位置,当primary为true时,controller...CustomScrollView作为容器组件时,子组件不能是ListView、GridView等可滚动组件,会造成滚动冲突。...,//是否是与父级关联的主滚动视图 ScrollPhysics physics,//设置滚动效果 bool shrinkWrap = false,//子组件是否只满足自身大小 Key...分层渲染可以降低视图渲染带来的性能开销。 无论是创建组合组件还是创建自绘组件,首先需要考虑如何将复杂的布局简化,把大问题拆分成若干小问题。
我们先来看看ListView怎么用。ListView提供了一个默认构造函数ListView,我们可以通过设置它的 children 参数,很方便地将所有的子Widget包含到ListView中。...在ListView中,有两种方式支持分割线: 一种是,在itemBuilder中,根据index的值动态创建分割线,也就是将分割线视为列表项的一部分; 另一种是,使用ListView的另一个构造方法,...ListView的组件控制器是ScrollController,我们可以通过它来获取视图的滚动信息,更新视图的滚动位置。...ListView组件,同时支持垂直方向和水平方向滚动,不仅提供了少量一次性创建子视图的默认构造方法,也提供了大量按需创建子视图的ListView.builder机制,并且支持自定义分割线。...ScrollController与ListView绑定,进行滚动信息的监听,进行相应的滚动控制;NotificationListener,通过将ListView纳入子Widget,实现滚动事件的获取。
在Flutter中,我们也有对应的列表Widget,就是ListView。 注意:在Flutter里面想要实现滑动效果,都需要在组件外部包裹滚动的视图。...如果我们想要在一个页面中,同时包含多个可滚动组件,且使它们的滑动效果能统一起来,比如一个滑动的视图中包括一个列表视图(ListView),一个网格视图(GridView),且让他们的滑动效果统一。...上面提及的部分组件是和可滚动组件无关的,它们主要是为了结合CustomScrollView一起使用,这是因为CustomScrollView的子组件必须都是Sliver。...此处使用ListView作为示例进行讲解。...ListView、GridView的组件控制器是ScrollController,我们可以通过它来获取视图的滚动信息,并且可以调用里面的方法来更新视图的滚动位置。
1、无限滚动长列表 前端的业务开发中会遇到数量很大的列表展示情况,一般的处理方法是使用某种方法分屏分页的加载数据。 通常的做法是检测是否滚动到底,然后进行网络请求操作。...比如列表的高度是 300,右侧有纵向滚动条可以滚动,那么视觉可见的区域就是可见区域。 ?...遇到的问题: Treeview是一级一级展开的,最开始让人自然而然的想到,每次展开的时候我们发出网络请求,然后更新组件。...这样理论上是可行的,但考虑到前端可以任意滚动,并且后端的逻辑会很复杂。所以我们还是暂不考虑。 解决方案2: 我把他总结成视图层向外索要数据。...第一步:视图数据层建出空树:进入节点,先拉到直接子节点count,在treeView的数据层该节点下新建一个count长的空Array。
01 - 视图的布局方式 简单说一下我对 Flutter 视图布局的看法,在前篇中我有提到 Flutter 是使用了 Dart 语言进行编写,所以弱化了视图编辑的部分,视图的渲染、结构、布局都通过代码逻辑来生成...视图布局》系列文章中我将 widget 下的第一级 widget 称之为 “子元素” 以便让少侠们理解。...ListBody 一个 Widget,它沿着一个给定的轴,顺序排列它的子元素。 ListView 可滚动的列表控件。...ListView 是最常用的滚动 Widget,它在滚动方向上一个接一个地显示它的子元素。在纵轴上,子元素们被要求填充ListView。 Table 为其子元素使用表格布局算法的 Widget。...IntrinsicHeight 一个 Widget,它将它的子元素的高度调整其本身实际的高度。 AspectRatio 一个 Widget,试图将子元素的大小指定为某个特定的长宽比。
既然是一个 View,那么就不可少的要经历onMeasure()、onLayout()、onDraw() 这三个方法。...Adapter工作原理 首先是适配器,适配器的作用都是类似的,用于提供每个 item 视图,并返回给RecyclerView 作为其子布局添加到内部。...但是,与 ListView 不同的是,ListView 的适配器是直接返回一个 View,将这个 View 加入到 ListView 内部。...而 RecyclerView 是返回一个 ViewHolder 并且不是直接将这个 holder 加入到视图内部,而是加入到一个缓存区域,在视图需要的时候去缓存区域找到 holder 再间接的找到 holder...但是有一点,在 RecycledView 内部的这个第二级缓存池RecycledViewPool 是可以被多个 RecyclerView 共用的,这一点比起直接缓存 View 的 ListView 就要高明了很多
ListView ListView是最常用的可滚动组件之一,它可以沿一个方向线性排布所有子组件,并且它也支持基于Sliver的延迟构建模型。...长度”是指滚动方向上子组件的长度,也就是说如果滚动方向是垂直方向,则itemExtent代表子组件的高度;如果滚动方向为水平方向,则itemExtent就代表子组件的宽度。...在ListView中,指定itemExtent比让子组件自己决定自身长度会更高效,这是因为指定itemExtent后,滚动系统可以提前知道列表的长度,而无需每次构建子组件时都去再计算一下,尤其是在滚动位置频繁变化时...都需要一个widget数组作为其子元素,这些方式都会提前将所有子widget都构建好,所以只适用于子widget数量比较少时,当子widget比较多时,我们可以通过GridView.builder来动态创建子...可滚动组件的Sliver版 但是在CustomScrollView中,需要粘起来的可滚动组件就是CustomScrollView的Sliver了,如果直接将ListView、GridView作为CustomScrollView
和尚在学习过程中会在一个 Page 页面同时用到 GridView 和 ListView 或多个 ListView,此时就会遇到常见的滑动冲突问题。...CustomScrollView 允许包含多种滚动模型,例如列表/网格和扩展标题。但其子 Widget 必须为 sliver 类型的。...shrinkWrap 常用于内容大小不确定情况,如果滚动视图(ListView/GridView/ScrollView 等)没有收缩包装,则滚动视图将扩展到允许的最大大小。...如果是无界约束,则 shrinkWrap 必须为 true。 primary 如果为 true,即使滚动视图没有足够的内容来支撑滚动,滚动视图也是可滚动的。...否则,默认为 false 情况下,只有具有足够内容的用户才能滚动视图。 ?
TableLayout的一级子节点还匹配父元素(宽度匹配、但是高度不匹配)。 ...TableRow的子节点的宽和高是包裹内容。...一个是从里往外撑,一个是从外往里撑 ScrollView ScrollView滚动视图是指当拥有很多内容,屏幕显示不完时,需要通过滚动跳来显示的视图。ScrollView只支持垂直滚动。...,HorizontalScrollView用于设置水平滚动条:需要注意的是,有一个属性是 scrollbars 可以设置滚动条的方向:但是ScrollView设置成horizontal是和设置成none...ListView MVC架构 M:model模型层,要显示的数据 ————people集合 V:view视图层,用户看到的界面 ————ListView c:control控制层,操作数据如何显示 ——
Flutter 将 Widget 设计成不可变的,所以当视图渲染的配置信息发生变化时,Flutter 会选择重建 Widget 树的方式进行数据更新,以数据驱动 UI 构建的方式简单高效。...这时,各自视图的滚动和布局模型就是相互独立、分离的,就很难保证整个页面统一一致的滑动效果。 Flutter 是如何解决多 ListView 嵌套时,页面滑动效果不一致的问题的呢?...ListView 的组件控制器则是 ScrollControler,我们可以通过它来获取视图的滚动信息,更新视图的滚动位置。...ListView 关联后才可以监听到滚动信息;通过 NotificationListener 则可以监听其子 Widget 中的任意 ListView,不仅可以得到这些 ListView 的当前滚动位置信息...在 Flutter 中,Container 本身可以单独作为控件存在(比如单独设置背景色、宽高),也可以作为其他控件的父级存在:Container 可以定义布局过程中子 Widget 如何摆放,以及如何展示
因此今天我也是在这里特别申明一下,我所写的所有文章均是首发于CSDN博客,如果你阅读这篇文章时是在别的网站,那么你将无法找到我前面所写的关于传统滑动菜单的文章,而且你的疑问和留言也将得不到解答。...image3dView = (Image3dView) findViewById(R.id.image_3d_view); // 将左侧布局传入3D视图中作为生成源 image3dView.setSourceView...3D视图的大小 image3dView.setLayoutParams(image3dViewParams); // 保证在滑动过程中3D视图可见,左侧布局不可见 showImage3dView...第二个LinearLayout是右侧布局,里面放入了一个按钮和一个ListView,都是用于显示左侧布局而准备的。第三个是Image3dView,当然是用于在滑动过程中显示左侧布局的镜像图片了。...,调用ThreeDSlidingLayout的setScrollEvent方法,将ListView作为绑定布局传入,这样就可以通过拖动ListView来显示或隐藏左侧布局。
风格的滚动指示器(滚动条),如果要给可滚动组件添加滚动条,只需要将 Scroolbar 作为可滚动组件的任意一个父级组件即可,如: Scrollbar( child: SingleChildScrollView...800 像素,但是 ViewPort 任然是 800 像素 基于 Sliver 的延时构建 通常可滚动的组件会非常多,占用的总高度也会非常大;如果一次性将子组件全部构建出将会非常昂贵!...ListView 是最常用的可滚动组件之一,他可以沿一个方向线性排列所有子组件,并且他也支持基于 Sliver 的延时构建模型,ListView 的定义如下: ListView({ ......在 ListView 中指定 itemExtent 比让子组件自己决定吱声的长度会更有效,因为指定后,滚动系统可以提前知道列表的长度,而无需每次构建子组件是都去计算一下,尤其是在滚动位置频繁变化时(滚动系统需要频繁去计算列表的高度...但是在 Custom 中,需要粘起来可滚动的组件就是 CustomScrollView 的 Sliver 了,如果将 ListView 或者 GridView 作为 CustomScrollView
概述 ListView作为核心组件之一,主要用于高效地显示一个可以垂直滚动的变化的数据列表。经过自定义组装,我们还可以用它实现九宫格等页面效果。...DataSource是需要渲染界面的数据源,renderRow是根据数据源的元素返回的可渲染的组件,即ListView的一行。...回调函数,这个函数返回ListView的一行作为一个可渲染的组件。...每次事件循环(每帧)渲染的行数 onEndReachedThreshold 调用onEndReached之前的临界值,单位是像素 onEndReached 当所有的数据都已经渲染过,并且列表被滚动到距离最底部不...3,渲染单个Cell视图 ListView界面由一个一个子视图组成,我们需要在render的时候渲染子视图,通常为了代码维护的方便,我们会将子视图通过自定义为视图使用。
大家好,我是ListView,我是React Native大家族中基础组件中,一个核心组件。我可以高效的展示垂直滚动的变化的数据列表,而且这个列表有一个特点就是结构和数据比较相似才可以哦。...在我母亲制定的官方介绍中,这么说:有一些性能优化使得我ListView可以滚动的更加平滑,尤其是在动态加载可能很大(或者概念上无限长的)数据集的时候: 只更新变化的行 - 提供了rowHasChanged...该值true代表可见,false代表在视图之外不可见的行。...onEndReached function 当所有的数据都已经渲染过,并且列表被滚动到距离最底部不足onEndReachedThreshold个像素的距离时调用。原生的滚动事件会被作为参数传递。...scrollRenderAheadDistance number 当该行进入屏幕多少像素以内之后就开始渲染该行 stickyHeaderIndices [number] ios独有 一个子视图下标的数组
ScrollView是一种FrameLayout,意味需要在其上放置有自己滚动内容的子元素。子元素可以是一个复杂的对象的布局管理器。...此方法将视图滚动到顶部或者底部,并且将焦点置于新的可视区域的最顶部/最底部组件。若没有适合的组件做焦点,当前的ScrollView会收回焦点。...此方法将向上或者向下滚动一屏,并且将焦点置于新可视区域的最上/最下。如果没有适合的component作为焦点,当前scrollView将收回焦点。...protected int computeVerticalScrollRange () 滚动视图的可滚动范围是所有子元素的高度。...也可能是视图的其他子视图使用的) parentHeightMeasureSpec 当前视图要求的宽度 heightUsed 垂直方向上由父视图使用的空白 (也可能是视图的其他子视图使用的)
在监听器中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和 listView 被滚动时调用的方法(onScroll) ② 在滚动状态发生改变的方法中,有三种状态: 手指按下移动的状态...在每次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以提示用户无更多数据了。 3.如何刷新 ListView 中单个 item 的数据,不刷新整个 ListView 的数据?...都获取不到的话从网络下载图片并保存到 SD 卡同时加入内存并显示(视情况看是否要显示) 原理: 优化一:先从内存中加载,没有则开启线程从 SD 卡或网络中获取,这里注意从 SD 卡获取图片是放在子线程里执行的...所以解决之道在于可见则显示,不可见则不显示。 12.你知道ListView的setEmptyView方法吗?...在Android开发中,用ListView显示数据时,如果数据为空,通常需要显示一个提示视图,而setEmptyView便可解决此问题
(类似于 Android 中的 id) scrollDirection:滚动方向,默认是垂直 reverse:是否按照阅读方向相反的方向滑动。...ScrollController的主要作用是控制滚动位置和监听滚动事件 child:子元素 import 'package:flutter/material.dart'; /** * @des Scroll...中的 id) scrollDirection:滚动方向,默认是垂直 reverse:是否按照阅读方向相反的方向滑动。...指定 itemExtent 的值比让子元素决定自身长度在绘制时更高效,特别是在滚动位置频繁变化的状态下,因为设置 itemExtent 可以让滚动系统提前知道列表的长度。...itemCount, ); key:当前元素的唯一标识符(类似于 Android 中的 id) scrollDirection:滚动方向,默认是垂直 reverse:是否按照阅读方向相反的方向滑动
这是最基本的检查,如果连这个方法得到的返回值都是View.INVISIBLE或者View.GONE 的话,那么它对用户肯定是不可见的。...相对布局 RelativeLayout - 用于定义与父视图和兄弟视图的相对位置的布局。...绝对布局(已淘汰) 这些布局管理器都扩展了 View Group 类(它本身是 View 类的子类),该类专门设计为包含和布置多个子视图。...(这意味着您应该只放入一个子视图,该子项包含要滚动的完整内容),允许用户垂直滚动,来展示比屏幕可显示范围更多的内容。...ListView 是为显示较多项列表而优化的特殊控件。它能非常高效地创建、回收和显示视图,而且经过优化,能非常顺畅地滚动。
前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪些方法技巧来优化ListView的效率。...我们可以看到getView()方法中传入了一个参数convertView,可以验证该convertView的值有时候是null,有时候又不是null,特别是当用户滚动ListView的时候。...当然这是不可能的,毕竟Android系统的内存有限,不可能无限新建列表项组件。实际上Android缓存了视图组件,由于Android系统中有一个Recycler构件,其工作原理如下图所示。...由于findViewById()方法可以从行所在根视图的所有子组件中找到组件,因此可能需要执行相当多的指令,而在重复取的相同组件的情况下则更是如此。...在持有者模式中,Tag标签用来保存对象,而对象又用来保存要使用的子组件。在将持有者添加到视图后,只要用到了行,就可以轻而易举的访问其子组件,而不必再调用findViewById()方法了。