ListView 未使用自定义 ListItemComponent

标签 listview blackberry-10 blackberry-cascades

我试图在我的级联中使用自定义的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() 返回的内容不匹配。如果 MyListModelGroupDataModel,则将 ListItemComponent 更改为 type: "item",否则使用 type: "" 或完全删除 type 属性,以便默认情况下将您的 ListItemComponent 用于所有项目。

关于ListView 未使用自定义 ListItemComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300452/

相关文章:

javascript - 如何使用 React Native ListView 高效搜索数据

android - FLutter中可滚动列中的4个水平Listview

blackberry-simulator - 在 Blackberry 10 中运行我的应用程序

c++ - 构建应用程序时出现 undefined reference 错误;

html - Blackberry 10 HTML5 数字输入标签-点击后输入字段变为空

c++ - 如何响应 Blackberry Cascades 中的 photoSaved 信号

java - 非常奇怪的 Android NullPointerException

android - 在清扫选项卡中插入 ListView

c++ - 打开来自 Blackberry 10 Cascades 上的调用请求的文件

c++ - 级联和信号/槽