代码之家  ›  专栏  ›  技术社区  ›  Bojan Kogoj

ListView未使用自定义ListItemComponent

  •  2
  • Bojan Kogoj  · 技术社区  · 13 年前

    我正在尝试使用自定义 列表项组件 然而,在我的瀑布中,它忽略了它 标签 ,将其涂成青色并放入ListItemData.text,它会用ListItemData.description填充我的列表(我的json有文本、描述、状态和图像)。 You can see screenshot here 。如果我使用 标准列表项 所有信息都能正确显示。

    质量管理:

    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);
        }
    }
    
    2 回复  |  直到 13 年前
        1
  •  4
  •   nonesuchnick    13 年前

    这取决于DataModel实现/继承的类型。在大多数情况下,当ListView需要知道要显示的项的类型时(请参见 ListItemTypeMapper 对于异常) itemType() 来自 DataModel 默认情况下,大多数数据模型将返回一个空字符串,但 GroupDataModel 将返回“标题”或“项目”,具体取决于项目是否为标题。

    您已指定您的 ListItemComponent 仅对类型为“listItem”的项有效,该项很可能与您的 MyListModel::itemType() 正在返回。如果 MyListModel 是一个 GroupDataModel ,然后更改您的 列表项组件 为了 type: "item" ,否则使用 type: "" 或删除 type 使您的 列表项组件 默认情况下用于所有项目。

        2
  •  0
  •   Saravana Kumar    11 年前

    在ListItemComponent{}中,您有一个“type:”字段,您应该将值设置为“item”,即。 类型:“项目” 。然后列表视图将使用自定义组件