如何在 QML 中动态更新 ListView
How to dynamically update a ListView in QML
我有一个 ListView,它显示用户的所有通知列表。现在,因为我正在使用 Component.onCompleted
,如果列表更新,则不会显示新列表,而是显示在实例化期间存在的列表。我们如何解决这个问题?将 Loader 与单独的组件一起使用会有帮助吗?
property int numNotifications: backend_service.num_notifications
property var notifications: []
onNumNotificationsChanged: {
for(var x=0; x<numNotifications; x++) {
var notif = backend_service.notifications.get(x);
notifications.push(notif)
}
}
Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
color: "black"
height: 500
width: 0.95 * parent.width
ListView {
anchors.fill: parent
model: notifModel
delegate: notifDelegate
}
}
ListModel {
id: notifModel
Component.onCompleted: {
for(var i in notifications) {
notifModel.append({"name": notifications[i]})
}
}
}
Component {
id: notifDelegate
Row {
spacing: 10
Text { text: name; color: "white" }
}
}
Component.onCompleted 仅在构建对象时运行,而不会再次运行。因此,使用该方法向模型添加项目是没有用的,您应该使用报告新数据的函数:
onNumNotificationsChanged: {
for(var x=0; x<numNotifications; x++) {
var notif = backend_service.notifications.get(x);
notifModel.append({"name": notif})
}
}
我有一个 ListView,它显示用户的所有通知列表。现在,因为我正在使用 Component.onCompleted
,如果列表更新,则不会显示新列表,而是显示在实例化期间存在的列表。我们如何解决这个问题?将 Loader 与单独的组件一起使用会有帮助吗?
property int numNotifications: backend_service.num_notifications
property var notifications: []
onNumNotificationsChanged: {
for(var x=0; x<numNotifications; x++) {
var notif = backend_service.notifications.get(x);
notifications.push(notif)
}
}
Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
color: "black"
height: 500
width: 0.95 * parent.width
ListView {
anchors.fill: parent
model: notifModel
delegate: notifDelegate
}
}
ListModel {
id: notifModel
Component.onCompleted: {
for(var i in notifications) {
notifModel.append({"name": notifications[i]})
}
}
}
Component {
id: notifDelegate
Row {
spacing: 10
Text { text: name; color: "white" }
}
}
Component.onCompleted 仅在构建对象时运行,而不会再次运行。因此,使用该方法向模型添加项目是没有用的,您应该使用报告新数据的函数:
onNumNotificationsChanged: {
for(var x=0; x<numNotifications; x++) {
var notif = backend_service.notifications.get(x);
notifModel.append({"name": notif})
}
}