現在、画像の横にニュース スニペットを表示するアプリの一部に取り組んでいます (画像が存在する場合)。このニュースのリストは、SegmentedControl の「タブ」ページの一部であり、ユーザーの必要に応じて非表示にしたり再表示したりできます。画像はネットワーク経由で読み込まれるため、ImageTracker によって処理され、完全に読み込まれたときにのみプロパティとして設定されます。
私が抱えている問題は、これらの画像は最初は正常に読み込まれますが、別の SegmentControl の「タブ」に移動してからニュース タブに戻ると、これらの画像が消えてしまうことです。非アクティブなコンテナーの可視性を false に設定し、アクティブなコンテナーの可視性を true に設定することで、非表示にすることができます。
これは、データ バインディングを定義する方法です: ListView { id: lstShowNews objectName: "lstShowNews"
listItemComponents: [
ListItemComponent {
type: "item"
Detail_Tabs_NewsCell {
newsHeadline: ListItemData.headline
newsBlurbPreview: ListItemData.content
newsTimeAdded: ListItemData.time
newsImageVisible: ListItemData.hasImage
newsImage: ListItemData.image
}
}
]
}
カスタム リスト項目のエイリアス/プロパティ:
property alias newsImageVisible: newsImage.visible
property alias newsHeadline: newsTitle.text
property alias newsImage: newsImage.image
property string newsBlurbPreview: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam condimentum tellus vel magna dapibus aliquam. Nunc iaculis metus ut arcu tempus semper."
property string newsTimeAdded: "News Source - 3 hours ago"
リストのロードを処理する C++ コードのセクション:
/*!
* Handles loading for each tab page. Enables data to only be loaded on demand.
* @param index - The new selected index on the SegmentedControl
*/
void MyClass::onSegmentChanged(int index) {
if(index == 2) {
if(!mNewsLoaded) {
// Load the news
NewsRequester* news = new NewsRequester(mId);
connect(news, SIGNAL(requestDone(QList<NewsItem*>)), this, SLOT(onNewsReceieved(QList<NewsItem*>)));
indNews->start(); // Activity indicator
news->requestNews();
}
else {
// Caching functions
}
}
else {
// Stuff for other tabs
}
}
void MyClass::onNewsReceieved(QList<NewsItem*> newsItems) {
qDebug() << "Received news reply";
indNews->stop();
indNews->setVisible(false);
mNewsItems = newsItems;
setNewsModel();
}
void MyClass::setNewsModel() {
GroupDataModel* newsModel = new GroupDataModel(QStringList() << "news");
newsModel->setGrouping(ItemGrouping::None);
// Move the list items to the data model
for(int i = 0; i < mNewsItems.size(); i++) {
mNewsItems.at(i)->loadImage();
newsModel->insert(mNewsItems.at(i));
}
ListView* lstNews = root->findChild<ListView*>("lstShowNews");
lstNews->setDataModel(newsModel);
}
画像を追跡し、リストに渡される前に適切に読み込まれることを確認する機能:
/*!
* Tracks the status of the current local image and displays when ready
*/
void NewsItem::trackImage() {
// Load cascades image
mTracker = new ImageTracker(mLocalImage);
connect(mTracker, SIGNAL(stateChanged (bb::cascades::ResourceTracker::State)),
this, SLOT(onStateChanged (bb::cascades::ResourceTracker::State)));
}
/*!
* Passes the downloaded image's path to the list
*/
void NewsItem::onImageRetrieved(QString path) {
//qDebug() << "Received image " << path;
mLocalImage = QUrl(path);
trackImage();
}
/*!
* Display the image if it's been fully loaded in memory
*/
void NewsItem::onStateChanged(bb::cascades::ResourceTracker::State state) {
if(state == bb::cascades::ResourceTracker::Loaded) {
qDebug() << "Image loaded";
mLocalCascadesImage = mTracker->image();
emit localImageChanged();
}
}
mLocalCascadesImage のプロパティ:
Q_PROPERTY(bb::cascades::Image image READ localImage NOTIFY localImageChanged)
ListView がこのように誤動作する理由はありますか? ありがとう。