Flutter ListView详解

article/2025/9/26 6:31:07

ListView详解

    • ListView常用构造
      • ListView
        • ListView 默认构建
          • 效果
      • ListView ListTile
        • ListTile 属性
          • ListTile 使用
          • 效果
      • ListView builder
        • builder属性详细介绍
        • 分析几个比较难理解的属性
          • 效果
          • builder模式来设置分割线
      • ListView separated
        • separatorBuilder
          • separated设置分割线
          • 效果
      • ListView custom
          • childrenDelegate
      • 文章示例代码

ListView常用构造

ListView

我们可以直接使用ListView 它的实现也是直接返回最简单的列表结构,粗糙没有修饰。

ListView 默认构建

效果

在这里插入图片描述

 ///默认构建Widget listViewDefault(List<BaseBean> list) {List<Widget> _list = new List();for (int i = 0; i < list.length; i++) {_list.add(new Center(child: new Text(list[i].age.toString()),));}// 添加分割线var divideList =ListTile.divideTiles(context: context, tiles: _list).toList();return new Scrollbar(child: new ListView(// 添加ListView控件children: _list, // 无分割线
//        children: divideList, // 添加分割线/),);}

ListView ListTile

ListTileFlutter 给我们准备好的widget 提供非常常见的构造和定义方式,包括文字,icon,点击事件,一般是能够满足基本需求,但是就不能自己定义了

ListTile 属性

this.leading,              // item 前置图标
this.title,                // item 标题
this.subtitle,             // item 副标题
this.trailing,             // item 后置图标
this.isThreeLine = false,  // item 是否三行显示
this.dense,                // item 直观感受是整体大小
this.contentPadding,       // item 内容内边距
this.enabled = true,
this.onTap,                // item onTap 点击事件
this.onLongPress,          // item onLongPress 长按事件
this.selected = false,     // item 是否选中状态
ListTile 使用
效果

在这里插入图片描述

  /// ListTile代码Widget listViewListTile(List<BaseBean> list) {List<Widget> _list = new List();for (int i = 0; i < list.length; i++) {_list.add(new Center(child: ListTile(leading: new Icon(Icons.list),title: new Text(list[i].name),trailing: new Icon(Icons.keyboard_arrow_right),),));}return new ListView(children: _list,);}

ListView builder

builder 顾名思义 构造 可以非常方便的构建我们自己定义的child布局,所以在Flutter中非常的常用。

builder属性详细介绍

   //设置滑动方向 Axis.horizontal 水平  默认 Axis.vertical 垂直scrollDirection: Axis.vertical,//内间距padding: EdgeInsets.all(10.0),//是否倒序显示 默认正序 false  倒序truereverse: false,//false,如果内容不足,则用户无法滚动 而如果[primary]为true,它们总是可以尝试滚动。primary: true,//确定每一个item的高度 会让item加载更加高效itemExtent: 50.0,//内容适配shrinkWrap: true,//item 数量itemCount: list.length,//滑动类型设置physics: new ClampingScrollPhysics(),//cacheExtent  设置预加载的区域 cacheExtent: 30.0, //滑动监听
//        controller ,

分析几个比较难理解的属性

shrinkWrap特别推荐
child 高度会适配 item填充的内容的高度,我们非常的不希望child的高度固定,因为这样的话,如果里面的内容超出就会造成布局的溢出。
shrinkWrap多用于嵌套listView中 内容大小不确定 比如 垂直布局中 先后放入文字 listView (需要Expend包裹否则无法显示无穷大高度 但是需要确定listview高度 shrinkWrap使用内容适配不会有这样的影响)

primary
If the [primary] argument is true, the [controller] must be null.
在构造中默认是false 它的意思就是为主的意思,primary为true时,我们的controller 滑动监听就不能使用了

physics
这个属性几个滑动的选择
AlwaysScrollableScrollPhysics() 总是可以滑动
NeverScrollableScrollPhysics禁止滚动
BouncingScrollPhysics 内容超过一屏 上拉有回弹效果
ClampingScrollPhysics 包裹内容 不会有回弹

cacheExtent
这个属性的意思就是预加载的区域
设置预加载的区域 cacheExtent 强制设置为了 0.0,从而关闭了“预加载”

controller
滑动监听,我们多用于上拉加载更多,通过监听滑动的距离来执行操作。

效果

在这里插入图片描述

 ///listView builder 构建Widget listViewLayoutBuilder(List<BaseBean> list) {return ListView.builder(scrollDirection: Axis.vertical,   padding: EdgeInsets.all(10.0),reverse: false,primary: true,itemExtent: 50.0,shrinkWrap: true,itemCount: list.length,     cacheExtent: 30.0, physics: new ClampingScrollPhysics(),
//        controller ,itemBuilder: (context, i) => new Container(child: new Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[new Text("${list[i].name}",style: new TextStyle(fontSize: 18.0, color: Colors.red),),new Text("${list[i].age}",style: new TextStyle(fontSize: 18.0, color: Colors.green),),new Text("${list[i].content}",style: new TextStyle(fontSize: 18.0, color: Colors.blue),),],),));}
builder模式来设置分割线

我们在正常的需求中大部分是需要item的分割线的,而在builder模式中使用divide 会有种情况(divide放在item的布局中 通过Column),我们会发现divide并没有直接延时到item两端而是会有左右padding
所以我们可以通过另外一种方式去实现。

1.扩大list容积 为什么是两倍,因为我们给了divide的indexWidget listView = new ListView.builder(itemCount: list.length * 2 ,itemBuilder: (context, index) => itemDividerRow(context, index));
2. 根据下标分配item类型
itemDividerRow(context, int i) {
if (i.isOdd) {//是奇数return new Divider( //返回分割线height: 1.0,);} else {i = i ~/ 2;return getRowWidget(context, orderList[i]);  //返回item 布局}} 这样我们就可以去实现了,builder模式分割线 

ListView separated

separated 有分离的意思,其实它就相当于我们Android中的多类型adapter,那么关键就是在我们的这个属性上separatorBuilder

separatorBuilder

它和itemBuilder同时进行渲染,在同一个item下标中可以额外的修饰或者区分

  separatorBuilder: (content, index) itemBuilder: (content, index) 
separated设置分割线
separated设置分割线就非常的简单了,我们直接在separatorBuilder进行操作separatorBuilder: (content, index) {return new Divider()}
效果

在这里插入图片描述

///  listView separated 构建 用于多类型 分割
Widget listViewLayoutSeparated(List<BaseBean> list) {return ListView.separated(itemCount: list.length,separatorBuilder: (content, index) {//和itemBuilder 同级别的执行if (index == 2) {return new Container(height: 40.0,child: new Center(child: new Text("类型1"),),color: Colors.red,);} else if (index == 7) {return new Container(height: 40.0,child: new Center(child: new Text("类型2"),),color: Colors.blue,);} else if (index == 14) {return new Container(height: 40.0,child: new Center(child: new Text("类型3"),),color: Colors.yellow,);} else {return new Container();}},itemBuilder: (content, i) {return new InkWell(child: new Container(height: 30.0,child: new Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[new Text("${list[i].name}",style: new TextStyle(fontSize: 18.0, color: Colors.red),),new Text("${list[i].age}",style: new TextStyle(fontSize: 18.0, color: Colors.green),),new Text("${list[i].content}",style: new TextStyle(fontSize: 18.0, color: Colors.blue),),],)),onTap: () {print("1111");},);
//      return ;},);
}

ListView custom

大家可能对前两种比较熟悉,分别是传入一个子元素列表或是传入一个根据索引创建子元素的函数。
其实前两种方式都是第三种方式的“快捷方式”。因为 ListView 内部是靠这个 childrenDelegate 属性动态初始化子元素的。
我们使用builderseparated比较多,这个custom相对来说就比较少了。但是我们是需要了解的。

  ///listView custom 构建Widget listViewLayoutCustom(list) {
//    return ListView.custom(childrenDelegate: new MyChildrenDelegate());return ListView.custom(itemExtent: 40.0,childrenDelegate: MyChildrenDelegate((BuildContext context, int i) {return new Container(child: new Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[new Text("${list[i].name}",style: new TextStyle(fontSize: 18.0, color: Colors.red),),new Text("${list[i].age}",style: new TextStyle(fontSize: 18.0, color: Colors.green),),new Text("${list[i].content}",style: new TextStyle(fontSize: 18.0, color: Colors.blue),),],));},childCount: list.length,),cacheExtent: 0.0,);}
}
childrenDelegate

自定义childrenDelegate 当然我们可以对ListView中的child进行自己需要的操作。最难定义的也就是这个而已。

// ignore: slash_for_doc_comments
/*** 继承SliverChildBuilderDelegate  可以对列表的监听*/
class MyChildrenDelegate extends SliverChildBuilderDelegate {MyChildrenDelegate(Widget Function(BuildContext, int) builder, {int childCount,bool addAutomaticKeepAlive = true,bool addRepaintBoundaries = true,}) : super(builder,childCount: childCount,addAutomaticKeepAlives: addAutomaticKeepAlive,addRepaintBoundaries: addRepaintBoundaries);///监听 在可见的列表中 显示的第一个位置和最后一个位置@overridevoid didFinishLayout(int firstIndex, int lastIndex) {print('firstIndex: $firstIndex, lastIndex: $lastIndex');}///可不重写 重写不能为null  默认是true  添加进来的实例与之前的实例是否相同 相同返回true 反之false///listView 暂时没有看到应用场景 源码中使用在 SliverFillViewport 中@overridebool shouldRebuild(SliverChildBuilderDelegate oldDelegate) {// TODO: implement shouldRebuildprint("oldDelegate$oldDelegate");return super.shouldRebuild(oldDelegate);}
}

文章示例代码

ListViewDemo


http://chatgpt.dhexx.cn/article/aaqH7fRD.shtml

相关文章

UE4 ListView

UE4-ListView UE4ListView和U3D的思路不太一样&#xff0c;详细了解之后发现UE4的ListView还是蛮先进的&#xff0c;直接就实现了逻辑和显示分离&#xff0c;提高效率&#xff0c;相对的&#xff0c;他的用法也比Unity的ListView绕一些。举例&#xff0c;一个ListView如果设置…

Android 控件 —— ListView

ListView 的简单用法 在布局中加入 ListView 控件还算简单&#xff0c;先为 ListView 指定一个 id&#xff0c;然后将宽度和高度都设置为 match_parent&#xff0c;这样 ListView 就占满了整个布局的空间 <LinearLayout xmlns:android"http://schemas.android.com/ap…

ListView 组件

简介&#xff1a; ListView是最常用的可滚动组件之一 有三种构建方式&#xff1a; ListViewListView.builderListView.separated 主要参数说明&#xff1a; scrollDirection: Axis.horizontal 水平列表Axis.vertical 垂直列表 padding: 内边距 resolve: 组件反向排序 childr…

4.ListView

ListView 文章目录 ListView一、什么是ListView二、ListView入门1.ListView核心类2.代码编写步骤 三、ListView优化四、把复杂界面(通过xml文件实现)显示到ListView上1.View的静态方法2.获取LayoutInflater对象 五、SimpleAdapter & ArrayAdapter的使用1.ArrayAdapter2.Sim…

ListView及ListAdapter详解

ListView及ListAdapter详解 一、AdapterView 1. 简介 An AdapterView is a view whose children are determined by an Adapter. 简单地说就是其子视图是由适配器决定的视图组件 2. 子类 ListViewGridViewSpinnerGallery3. 常用方法 //功能:获取list中指定位置item get…

qt listview

运行图 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include <QStringListModel> #include <QModelIndex>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent 0);~Widget();pri…

flutter 之 ListView的使用与详解 map for listview.builder 的使用

1.ListView 配合ListTile 实现新闻列表样式 ListView(children: <Widget>[ListTile(title: const Text(我是 title),subtitle: const Text(我是 sub_title),leading: Image.asset(images/c.png,fit: BoxFit.cover,),trailing: const Icon(Icons.chevron_right,size: 22,…

android ListView

android ListView几个比较特别的属性 由于这两天在做listView的东西&#xff0c;所以整理出来一些我个人认为比较特别的属性&#xff0c;通过设置这样的属性可以做出更加美观的列表 首先是stackFromBottom属性&#xff0c;这只该属性之后你做好的列表就会显示你列表的最下面&am…

ListView使用总结

ListView使用总结 虽然随着RecyclerView的不断普及&#xff0c;相应的资源也越来越多&#xff0c;许多的项目都在使用RecyclerView&#xff0c;但作为他的前辈ListView&#xff0c;加深对ListView的使用有助于我们更好的适应到RecyclerView的使用中。 首先看一下我们实现的效…

Android有关ListView嵌套ListView的一些问题

本人在做评论回复功能的时候&#xff0c;查阅到ListView结合Adapter适配器具有以列表的形式 展示具体数据内容&#xff0c;并且能够根据数据的长度自适应屏幕显示的功能&#xff0c;因此打算在ListView中嵌套ListView完成点击事件后弹出输入框再输入数据后在下方显示回复内容&a…

ListView详解0

ListView常用方法总结 1、listview拖动变黑解决方法 在Android中&#xff0c;ListView是最常用的一个控件&#xff0c;在做UI设计的时候&#xff0c;很多人希望能够改变一下它的背景&#xff0c;使他能够符合整体的UI设计&#xff0c;改变背景背很简单只需要准备一张图片然后指…

C# ListView 的用法

ListView 是一种多列的列表视图控件&#xff0c;可以用于展示多个数据项及其相关信息。ListView 控件提供了丰富的属性和事件&#xff0c;可以用于实现各种各样的表格视图&#xff0c;包括带有单元格编辑、排序和分组等功能。 下面我们通过几个示例来演示如何使用 ListView 控…

Qt ListView使用

概述 Qt中ListView加载数据一般有两种方式&#xff0c;一种是直接qml文件中model直接定义并且放置数据&#xff0c;一种是C代码中定义Model&#xff0c;再setContextProperty的方式暴露给qml域。 步骤 &#xff08;1&#xff09;qml界面 import QtQuick 2.0 import QtQui…

Android控件listview ListView的用法

在Android开发中&#xff0c;ListView是一个比较常用的控件&#xff0c;它以列表的形式展示数据内容&#xff0c;并且能够根据列表的高度自适应屏幕显示。ListView的样式是由属性决定的&#xff0c;它的常用属性如下所示 android:listSelector 点击后改变背景颜色 android:divi…

Android之ListView实现

ListView 用来显示多个可滑动项&#xff08;Item&#xff09;列表的ViewGroup。 需要使用Adapter&#xff08;适配器&#xff09;将集合数据和每一个Item所对应的布局动态适配到ListView中显示 显示列表&#xff1a;listView.setAdapter(adapter) Adapter ArrayAdapter&#xf…

ListView使用方法

ListView使用方法总结 - 直接使用ListView组件创建列表 - 通过Activity继承ListActivity创建 - 定制ListView界面 直接使用ListView组件创建列表 通过数组资源文件指定列表项 先在XML布局文件中添加ListView标志&#xff0c;设置好相关属性&#xff1b;在values下创建数组资…

Android—— ListView 的简单用法及定制ListView界面

一、ListView的简单用法 2. 训练目标 1) 掌握 ListView 控件的使用 2) 掌握 Adapter 桥梁的作用 实现步骤&#xff1a; 1&#xff09;首先新建一个项目&#xff0c; 并让ADT 自动帮我们创建好活动。然后修改activity_main.xml 中的代码&#xff0c;如下所示&#xff1a; &…

QT listView学习

文章目录 listViewdemo说明demo演示model定义委托 QStyledItemDelegate总结 listView listView 对比 tableView 、 treeView来说&#xff0c;最大的不同就是数据结构的不同。treeView是像树一样的层次结构&#xff0c;而listView则就是像链表一样的结构 跟之前的treeView&…

还在用ListView?

还在用Lisview&#xff1f;RecyclerView都已经出来一年多了&#xff01; 想必大家多或多或少的接触过或者了解过RecyclerView&#xff0c;为什么没有用起来&#xff0c;原因大概如下&#xff1f; ListView我用的挺好的&#xff0c;为什么要换RecyclerView&#xff1f;ListView…

ListView用法

ListView是用于显示数据的&#xff0c;先在窗体中拉一个lisview控件&#xff0c;还有一些新增、修改、删除、查询按钮和文本框&#xff0c;控件名称为listview,按钮为btnInsert,btnUpate,btnDeleteOne,btnDelete,btnSelect,文本框的名称为txtName,txtSex,txtPhone,txtAddress,设…