我试图在我的级联中使用自定义的ListItemComponent,但它忽略了它。它不是绘制我的标签、将其着色为青色并放入 ListItemData.text,而是使用 ListItemData.description 填充我的列表(我的 json 包含文本、描述、状态和图像)。 You can see screenshot here 。如果我使用StandardListItem,所有信息都会正确显示。
QML:
Page {
Container {
ListView {
id: myListView
dataModel: MyListModel {
id: myListModel
}
listItemComponents: [
ListItemComponent {
type: "listItem"
Container {
id:item
layout: StackLayout {
orientation: LayoutOrientation.LeftToRight
}
Label {
id: text
text: ListItemData.text
textStyle {
color: Color.Cyan
}
}
}
}
]
}
}
onCreationCompleted: {
myListModel.load("app/native/assets/mydata.json")
}
}
c++:
void MyListModel::load(const QString& file_name)
{
bb::data::JsonDataAccess jda;
QVariantList lst = jda.load(file_name).value<QVariantList>();
if (jda.hasError()) {
bb::data::DataAccessError error = jda.error();
qDebug() << file_name << "JSON loading error: " << error.errorType() << ": " << error.errorMessage();
}
else {
qDebug() << file_name << "JSON data loaded OK!";
append(lst);
}
}
QVariant MyListModel::value(int ix, const QString &fld_name)
{
QVariant ret;
if(ix >= 0 && ix < size()) {
QVariantMap curr_val = QVariantListDataModel::value(ix).toMap();
ret = curr_val.value(fld_name);
}
return ret;
}
void MyListModel::setValue(int ix, const QString& fld_name, const QVariant& val)
{
if(ix >= 0 && ix < size()) {
QVariantMap curr_val = QVariantListDataModel::value(ix).value<QVariantMap>();
curr_val[fld_name] = val;
replace(ix, curr_val);
}
}
最佳答案
这取决于您的 DataModel 实现/继承的类型。当 ListView 需要知道要显示的项目的类型时,在大多数情况下(请参阅 ListItemTypeMapper 了解异常(exception)情况),它会从 DataModel 调用 itemType()
。默认情况下,大多数数据模型将返回空字符串,但 GroupDataModel将返回“header”或“item”,具体取决于该项目是否是标题。
您已指定您的 ListItemComponent
仅对“listItem”类型的项目有效,这很可能与您的 MyListModel::itemType()
返回的内容不匹配。如果 MyListModel
是 GroupDataModel
,则将 ListItemComponent
更改为 type: "item"
,否则使用 type: ""
或完全删除 type
属性,以便默认情况下将您的 ListItemComponent
用于所有项目。
关于ListView 未使用自定义 ListItemComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300452/