gpt4 book ai didi

listview - 如何检测 ListView Item 的位置?

转载 作者:IT王子 更新时间:2023-10-29 06:45:24 25 4
gpt4 key购买 nike

如何根据屏幕上的位置向 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 Item 的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55359241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com