0

Я создал ListView, и я хочу использовать его с пользовательским DataModel. Однако у меня есть проблема: на момент создания представления у меня нет данных, загруженных в модель. Данные модели устанавливаются после создания представления, и когда я устанавливаю данные на модель, представление не обновляется и не считывает данные модели. Это мой ListView:Как уведомить ListView о том, что DataModel изменился

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 
     } 
    } 
} 

А вот моя модель:

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; 
} 

Я положил некоторые отладочные сообщения в childCount функции, например, и он вызывается только один раз, что означает, что ListView просит модель данных только один раз, при создании модели.

Можно ли заставить ListView снова прочитать данные модели после того, как модель заселена данными? Или как я могу заставить этот подход работать и загружать данные в представление?

Спасибо!

ответ

1

Для того, чтобы модель, которая будет обновлена, функция setCountryData элемент должен быть обновлен следующим образом:

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

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

FML ...

-2

Вы должны объявить сигнал для свойства, которое требуется для обновления в бэкэнд.

Q_PROPERTY(QVariant countryData READ getCountryData WRITE setCountryData NOTIFY contryDataChanged) 

добавить свою декларацию.

Тогда вы говорите -

emit contryDataChanged(); 

везде, где вы чувствуете, как список должен перечитать содержимое. (обычно методы настройки).

+0

создание countryData свойство и выдача сигнала уведомления не имеют никакого отношения к представлению. –