0

J'ai créé un ListView et je veux l'utiliser avec un DataModel personnalisé. Cependant, j'ai un problème: au moment où la vue est créée, je n'ai pas les données chargées dans le modèle. Les données du modèle sont définies après la création de la vue et lorsque j'ai défini les données sur le modèle, la vue ne se met pas à jour et ne relit pas les données du modèle. Ceci est mon ListView:Comment notifier ListView que DataModel a changé

ListViewCountainer.qml

Container { 
    // countryModelData is set after ListViewCountainer gets created 
    // when countryModelData gets set, the model is populated with data 
    property variant countryModelData 

    leftPadding: 20.0 
    rightPadding: 20.0 
    topPadding: 20.0 
    bottomPadding: 20.0 

    CountryDetailsListView { 
     id: countryDetailsListView 

     dataModel: CountryDataModel { 
      countryData: countryModelData 
     } 
    } 
} 

Et voici mon modèle:

countrydatamodel.h

#ifndef COUNTRYDATAMODEL_H_ 
#define COUNTRYDATAMODEL_H_ 

#include <QtCore/QAbstractListModel> 
#include <QtCore/QList> 
#include <QObject> 
#include <QtCore/QVariant> 

#include <bb/cascades/DataModel> 
#include <bb/data/JsonDataAccess> 

class CountryDataModel : public bb::cascades::DataModel 
{ 
    Q_OBJECT 

    Q_PROPERTY(QVariant countryData READ getCountryData WRITE setCountryData) 

public: 
    CountryDataModel(QObject* parent = 0); 
    virtual ~CountryDataModel(); 

    Q_INVOKABLE int childCount(const QVariantList& indexPath); 
    Q_INVOKABLE QVariant data(const QVariantList& indexPath); 
    Q_INVOKABLE bool hasChildren(const QVariantList& indexPath); 
    Q_INVOKABLE QString itemType(const QVariantList& indexPath); 
    Q_INVOKABLE void removeItem(const QVariantList& indexPath); 

    Q_INVOKABLE QVariant getCountryData(); 
    Q_INVOKABLE void setCountryData(QVariant data); 

private: 
    QVariantList m_elements; 
}; 

#endif /* COUNTRYDATAMODEL_H_ */ 

countrydatamodel.cpp

#include <src/countrydatamodel.h> 

#include <QtCore/QtAlgorithms> 
#include <QtCore/QDebug> 

#include <bb/cascades/DataModel> 
#include <bb/data/JsonDataAccess> 

CountryDataModel::CountryDataModel(QObject* parent) : bb::cascades::DataModel(parent) 
{ 
} 

CountryDataModel::~CountryDataModel() 
{ 
} 

bool CountryDataModel::hasChildren(const QVariantList &indexPath) 
{ 
    qDebug() << "==== CountryDataModel::hasChildren" << indexPath; 

    if ((indexPath.size() == 0)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

int CountryDataModel::childCount(const QVariantList &indexPath) 
{ 
    qDebug() << "==== CountryDataModel::childCount" << indexPath; 

    if (indexPath.size() == 0) 
    { 
     qDebug() << "CountryDataModel::childCount" << m_elements.size(); 

     return m_elements.size(); 
    } 

    qDebug() << "==== CountryDataModel::childCount" << 0; 

    return 0; 
} 

QVariant CountryDataModel::data(const QVariantList &indexPath) 
{ 
    qDebug() << "==== CountryDataModel::data" << indexPath; 

    if (indexPath.size() == 1) { 

     return m_elements.at(indexPath.at(0).toInt()); 
    } 

    QVariant v; 
    return v; 
} 

QString CountryDataModel::itemType(const QVariantList &indexPath) 
{ 
    Q_UNUSED(indexPath); 

    return ""; 
} 

void CountryDataModel::removeItem(const QVariantList& indexPath) 
{ 
    if(indexPath.size() == 1) { 
     m_elements.removeAt(indexPath.at(0).toInt()); 
    } 

    emit itemRemoved(indexPath); 
} 

QVariant CountryDataModel::getCountryData() 
{ 
    return QVariant(m_elements); 
} 

void CountryDataModel::setCountryData(QVariant data) 
{ 
    m_elements = data.toList(); 

    qDebug() << "================== CountryDataModel: " << m_elements; 
} 

je mets des messages de débogage dans la fonction childCount par exemple, et il est appelé une seule fois, ce qui signifie que la demande ListView le modèle pour les données une seule fois, lorsque le modèle est créé.

Est-il possible de forcer ListView à relire les données du modèle après que le modèle soit rempli avec des données? Ou comment pourrais-je faire fonctionner cette approche et charger les données dans la vue?

Merci!

Répondre

1

Pour que le modèle soit mis à jour, la fonction de membre setCountryData doit être mis à jour comme ceci:

void CountryDataModel::setCountryData(QVariant data) 
{ 
    m_elements = data.toList(); 

    emit itemsChanged(bb::cascades::DataModelChangeType::AddRemove, QSharedPointer<bb::cascades::DataModel::IndexMapper>(0)); 
} 

FML ...

-2

Vous devez déclarer un signal pour la propriété que vous voulez mettre à jour en backend.

Q_PROPERTY(QVariant countryData READ getCountryData WRITE setCountryData NOTIFY contryDataChanged) 

ajouter également sa déclaration.

Ensuite, vous dites -

emit contryDataChanged(); 

où vous vous sentez comme la liste devrait relire le contenu. (normalement les méthodes de setter).

+0

en faisant de countryData une propriété et en émettant un signal de notification n'a rien à voir avec la vue. –