Изображение исчезает при скрытии и повторном отображении ListView

В настоящее время я работаю над частью приложения, которое показывает фрагмент новостей рядом с изображением (если изображение существует). Этот список новостей является частью страницы «вкладки» SegmentedControl и может быть скрыт и повторно отображаться по требованию пользователя. Поскольку изображения загружаются по сети, они обрабатываются ImageTracker и устанавливаются в качестве свойства только после полной загрузки.

Проблема, с которой я столкнулся, заключается в том, что, хотя эти изображения загружаются нормально в первый раз, эти изображения потом перестают работать, если я перехожу на другую «вкладку» SegmentControl и затем возвращаюсь обратно на вкладку «Новости». Чтобы скрыть, нужно установить для видимости неактивных контейнеров значение false и установить для видимости активного контейнера значение true.

Вот как я определяю привязки данных:
Посмотреть список {
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 будет вести себя неправильно? Благодарю.

1

Решение

Решил это сам. Оказывается, мне также нужно было разоблачить newsImage.imageSource свойство и передайте ему путь к локально кэшированной версии изображения, если доступно. В то время как image свойство удобно для того, чтобы изображения появлялись, как только они были загружены, imageSource свойство должно использоваться для локально доступных файлов.

0

Другие решения

Других решений пока нет …