Yerstoday,I worte an android program which only has one list view
Today,I'll add feature about load more to the list
The page is implement of statefulWidget
The class used to updates page state is extend of State
To reload page need calls the method named setState in State
Note that the list will be reloaded when the page reloaded
So the data of initializing for list should be written in the method named initState
ScrollController be used to listens list scrolls
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> implements ScrollListener {
@override
void initState() {
// TODO: implement initState
super.initState();
adapter = new MyLoadMoreListAdater.name(getData(), this);
widgetList = adapter.getItemList(context);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: getLoadMoreList(context));
}
MyLoadMoreListAdater adapter;
List<Widget> widgetList;
getLoadMoreList(BuildContext context) {
return ListView(children: widgetList, controller: adapter.getController());
}
@override
void onLoaderMore(MyBaseAdapter data) {
// TODO: implement onLoaderMore
print("加載更多");
List<MyListData> addItem = addData(adapter.data.length);
adapter.data.addAll(addItem);
int temp = widgetList.length;
setState(() {
widgetList = adapter.getItemList(context);
print(temp);
});
print("加載end");
}
}
abstract class ScrollListener {
void onLoaderMore(MyBaseAdapter data);
}
class MyLoadMoreListAdater extends MyBaseAdapter<MyListData> {
ScrollListener listener;
MyLoadMoreListAdater(List data) : super(data);
MyLoadMoreListAdater.name(List data, this.listener) : super(data);
ScrollController getController() {
ScrollController scrollController = new ScrollController();
scrollController.addListener(() {
if (scrollController.position.pixels ==
scrollController.position.maxScrollExtent) {
listener.onLoaderMore(this);
print("下拉至最底部");
}
});
return scrollController;
}
@override
Widget getItem(BuildContext context, int pos) {
// TODO: implement getItem
return getLayout(data[pos], pos);
}
}
List getData(){
List <MyListData> data=[];
for(int i=0;i<10;i++){
data.add(new MyListData("item_title$i","item_content$i"));
}
return data;
}
List <MyListData> addData(int a) {
List <MyListData> data=[];
for (int i=a; i <a+10 ; i++) {
data.add(new MyListData("item_title$i", "item_content$i"));
}
return data;
}
2)Next,used another list construction method recommended by official website that is more suitable for updating
getLoadMoreList(BuildContext context) {
// return ListView(children: widgetList, controller: adapter.getController());
return ListView.builder(itemCount: widgetList.length,controller:adapter.getController(),itemBuilder: (BuildContext context,int pos){
return adapter.getItem(context, pos);
});
}
@override
void onLoaderMore(MyBaseAdapter data) {
// TODO: implement onLoaderMore
print("加載更多");
List<MyListData> addItem = addData(adapter.data.length);
adapter.data.addAll(addItem);
int temp = widgetList.length;
setState(() {
for(int i=temp;i<temp+addItem.length;i++){
widgetList.add(adapter.getItem(context, i));
}
});
// setState(() {
// widgetList = adapter.getItemList(context);
// print(temp);
// });
print("加載end");
}