美文网首页
Flutter(五) ListView组件的使用

Flutter(五) ListView组件的使用

作者: 骑马纵天下 | 来源:发表于2019-08-20 09:53 被阅读0次

    一. 基础列表(固定数据)。

    1. ListView是iOS上的tableView,ListTile是cell(每一个的item)。如果是普通的列表一般ListTile都能实现,功能相对来说挺全的。其中包括主 副标题 左边右边图标 边距等。

    • 全部属性:
      • leading, cell 左边的图标
      • title, cell 主标题
      • subtitle, cell 副标题
      • trailing, cell 右边图标
      • isThreeLine = false, cell 是否三行显示
      • dense, cell 直观感受是整体大小
      • contentPadding, cell 内容内边距
      • enabled = true, cell 是否可以响应
      • onTap, cell onTap cell点击事件
      • onLongPress, cell onLongPress 长按事件
      • selected = false, cell 是否选中状态
    class HomeContent extends StatelessWidget{
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return ListView(
          padding: EdgeInsets.all(10),//外边距
          children: <Widget>[//只要是Widget都可以写
            ListTile(
              title: Text('这是标题'),
              subtitle: Text('这是副标题'),
            ),
            ListTile(
              leading: Icon(Icons.access_alarms ,color: Colors.yellow,size: 40),
              title: Text(
                '这是标题',
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 20.0
                  ),
                ),
              subtitle: Text('这是副标题'),
              trailing: Icon(Icons.accessibility),
            ),
            //........省略       
          ],
        );
      }
    
    }
    
    效果图

    2. ListView默认是垂直列表,通过scrollDirection属性可以设置为水平列表

    垂直列表设置宽度是无效的,会自动占满父视图的宽度。水平列表设置高度无效,会自动占满父视图的高度。如果要设定固定宽高需要设置父视图的frame。

    scrollDirection: Axis.vertical//水平列表
    scrollDirection: Axis.horizontal//垂直列表
    
    class HomeContent extends StatelessWidget{
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return ListView(
          padding: EdgeInsets.all(10),
          scrollDirection: Axis.horizontal,
          //scrollDirection: Axis.vertical,
          children: <Widget>[
                Container(
                  width: 100,
                  height: 100,
                  color: Colors.red,
                ),
                Container(
                  width: 100,
                  height: 100,
                  color: Colors.yellow,
                ),
                Container(
                  width: 100,
                  height: 100,
                  color: Colors.black,
                ),
                Container(
                  width: 100,
                  height: 100,
                  color: Colors.orange,
                ),
                Container(
                  width: 100,
                  height: 100,
                  color: Colors.green,
                )
          ],
        );
      }
    
    }
    
    
    效果图

    二. 动态列表。

    通过循环语句创建包含ListTile组件的数组,给ListView的children属性。

    class HomeContent extends StatelessWidget{
       //自定义方法 私有方法 当前类可以使用 返回的是Widget组件
       List<Widget>  _listViewData(){
        List<Widget> list = List();
        for (var i = 0; i <  20; i++) {
          list.add(
            ListTile(
            title: Text('我是第$i个cell'),
          ));
        }
      return list;
      }
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return ListView(
          // padding: EdgeInsets.all(10),
          // scrollDirection: Axis.vertical,
          children: this._listViewData(),
        );
      }
    
    }
    
    效果图

    三. ListView绑定列表方式。

    1. 默认绑定列表方式

    创建包含ListTile的数组,直接for循环创建包含ListTile的数组。或者通过ListTile的divideTiles方法创建数组,其中第一个参数是上下文,第二个参数是包含组件的数组,通过divideTiles创建的数组中ListTile里面有分割线。

    
    var divideListData = ListTile.divideTiles(context: context ,tiles:  this.list).toList();
    
     //自定义方法 私有方法 当前类可以使用 返回的是Widget组件
       List<Widget> list = List();
      //  HomeContent(){
      //    for (var i = 0; i < 20; i++) {
      //      list.add(
      //        ListTile(
      //          title: Text('我是第$i个cell'),
      //        )
      //      );
      //    }
    
      //  }
       List<Widget>  _listViewData(BuildContext context){
        for (var i = 0; i <  20; i++) {
          list.add(
            ListTile(
            title: Text('我是第$i个cell'),
            onTap: (){
              showDialog(
                context:context ,
                builder: (BuildContext context){
                  return AlertDialog(
                    title: Text(
                      '我是标题',
                      style: TextStyle(fontSize: 20),
                    ),
                    content: Text('我是内容 - 选择的是:$i cell'),
                  );
                }
              );
            },
          ));
        }
        return list;
      }
    

    绑定列表:

    @override
      Widget build(BuildContext context) {
        var divideListData = ListTile.divideTiles(context: context ,tiles:  this.list).toList();
        // TODO: implement build
        return ListView(
          // padding: EdgeInsets.all(10),
          // scrollDirection: Axis.vertical,
          children: this._listViewData(context),
        );
      }
    

    2. 通过ListView.builder绑定

    ListView.builder有两个必须要传的参数itemCountitemBuilder。前者传的是cell的个数,后者传的是ListTile组件。需要把数组中的每个组件拿出来传给itemBuilder属性。

    @override
      Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: this.list.length,
          itemBuilder:(context,index){
            return this.list[index];
          }
        );
      }
    
    

    3. 通过ListView.separated绑定

    ListView.separated绑定和builder差不多,separated方法可以直接通过separatorBuilder属性设置分割线。

    return ListView.separated(
          itemCount: this.list.length,
          itemBuilder:(content , index){
              return this.list[index];
          },
          separatorBuilder: (BuildContext context, int index) => new Divider(),  // 分割线
        );
    

    相关文章

      网友评论

          本文标题:Flutter(五) ListView组件的使用

          本文链接:https://www.haomeiwen.com/subject/pkjusctx.html