如何检测ListView项的位置?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检测ListView项的位置?相关的知识,希望对你有一定的参考价值。

如何根据其在屏幕上的位置向listView项添加填充。例如,如果listView项目位于屏幕中间,我想将其填充增加10个点,如果listView项目靠近屏幕顶部,我想将其填充增加15个点。

答案

您可以通过将ScrollController附加到ListView并创造性地使用它来实现此目的:

enter image description here

首先,您需要定义一个ScrollController,用于获取ScrollController.offset以确定列表当前位置。然后我添加了一堆变量来调整这个动态列表,同时保持其预期的功能:

  class DynamicPadding extends StatefulWidget 
    DynamicPadding(Key key,) : super(key: key);

    @override
    _DynamicPaddingState createState() => _DynamicPaddingState();
  


  class  _DynamicPaddingState extends State<DynamicPadding> 

   ScrollController _controller;

   var _middlePadding = 10.0 ; // padding of centered items

   var _edgesPadding = 15.0 ; // padding of non-centered items

   var _itemSize = 100.0 ; 

   int _centeredItems = 3 ;

   int _numberOfEdgesItems ; // number of items which aren't centered at any moment

   int _aboveItems ; // number of items above the centered ones

   int _belowItems ; // number of items below the centered ones


   @override
   void initState() 
     _controller = ScrollController(); // Initializing ScrollController
     _controller.addListener(_scrollListener); add a listener to ScrollController to update padding
     super.initState();
   

   _scrollListener() 
     setState(() );
   

   @override
   Widget build(BuildContext context) 
     return new Scaffold(
         backgroundColor: Colors.grey.shade200,
         appBar: new AppBar(title: new Text('Dynamic Padding Example'),),
     body: ListView.builder(
     controller: _controller ,
     itemCount: 20,
     itemBuilder: (context, index) 

       // This is how to calculate number of non-centered Items
       _numberOfEdgesItems = ( (MediaQuery.of(context).size.height - _centeredItems*(_itemSize + 2*(_middlePadding))) ~/ (_itemSize + 2*(_edgesPadding)) ) ; 

       _aboveItems = ( ( (_controller.offset) / (_itemSize + 2*(_edgesPadding)) ) + _numberOfEdgesItems/2 ).toInt() ;

       _belowItems = _aboveItems + _centeredItems ;

     return Container(
     padding:  index >= _aboveItems && index < _belowItems ? EdgeInsets.all(_middlePadding) : EdgeInsets.all(_edgesPadding) ,
     child: Card(
     child: Container(
       height: _itemSize,
         child: new Row(
             mainAxisAlignment: MainAxisAlignment.center,
             children: <Widget>[
               Text(index.toString(), style: TextStyle(fontSize: 36.0, fontWeight: FontWeight.bold)),
               ]
             ),
           ),
         ),
       );
       ),
     );
   
 

以上是关于如何检测ListView项的位置?的主要内容,如果未能解决你的问题,请参考以下文章

从具有按钮的 ListView 获取列表项的位置

获取 ListView 项的子项相对于 Form 的坐标

Android ListView:获取可见项的数据索引

如何绑定listView中项的子属性?

如何更改 UWP 中选定 ListView 项的突出显示颜色(Windows 10)

在 Android 中,如何设置 ListView 项的高度和宽度?