2013-03-08 1 views
2

J'essaie d'utiliser un ListItemComponent personnalisé dans mes cascades mais il l'ignore. Au lieu de dessiner mon Label, en le colorant cyan et en mettant ListItemData.text, il remplit ma liste avec ListItemData.description (mon json a du texte, description, statut et image). You can see screenshot here. Si j'utilise StandardListItem toutes les informations sont affichées correctement.ListView n'utilise pas Custom ListItemComponent

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); 
    } 
} 
+0

Quelqu'un peut-il ajouter "ListItemComponent" aux balises s'il vous plaît, je n'ai pas assez de rep. –

Répondre

4

Cela dépend du type de votre DataModel implémente/hérite de. Lorsqu'un ListView doit connaître le type d'un élément à afficher, dans la plupart des cas (voir ListItemTypeMapper pour l'exception), il appelle itemType() à partir du DataModel. Par défaut, la plupart des datamodels renverront une chaîne vide, mais un GroupDataModel retournera "header" ou "item" selon que l'élément est un en-tête ou non.

Vous avez indiqué que votre ListItemComponent est uniquement valide pour les articles de type "listItem", qui ne correspondent pas nécessairement à ce que votre MyListModel::itemType() renvoie. Si MyListModel est un GroupDataModel, alors changez votre ListItemComponent pour type: "item", sinon utilisez type: "" ou supprimez la propriété type pour que votre ListItemComponent soit utilisé par défaut pour tous les articles.

0

Dans le ListItemComponent {}, vous avez un champ "type:", vous devez définir la valeur comme "item", c'est à dire. tapez: "item". Ensuite, l'affichage de la liste va utiliser le composant personnalisé