Ваши данные (Array
) хранятся в BehaviorSubject
, и когда вы звоните next(...)
, считается, что весь набор данных обновляется, поэтому ваш ListView полностью перезагружает весь список. Вы можете просто обновить объект по индексу, который немедленно обновит только конкретный элемент ListItem.
star(id: number): Observable<Element> {
return this._elements.pipe(
take(1),
tap(array => {
array.some(item => {
if (item.id === id) {
item.starred = !item.starred;
return true;
}
})
}),
switchMap(() => this.takeById$(id))
);
}
Редактировать:
Более того, вы не должны размещать ListViewвнутри ScrollView & StackLayout по крайней мере без явной высоты ListView. Самого ListView должно быть достаточно в большинстве случаев, поскольку он имеет встроенный прокручиваемый контейнер.