1

現在、画像の横にニュース スニペットを表示するアプリの一部に取り組んでいます (画像が存在する場合)。このニュースのリストは、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 がこのように誤動作する理由はありますか? ありがとう。

4

1 に答える 1

0

自分で解決しました。また、プロパティを公開newsImage.imageSourceし、ローカルにキャッシュされたバージョンの画像へのパスを渡す必要があることがわかりました (利用可能な場合)。このimageプロパティは、画像がダウンロードされるとすぐに表示されるようにするのに便利ですが、プロパティはimageSourceローカルで利用可能なファイルに使用する必要があります。

于 2012-09-06T08:27:52.317 に答える