У меня есть ListView
, который отображает список сеансов чата (аналогично Whatsapp/Facebook Messenger) со следующими rowHasChanged
:
rowHasChanged: (r1, r2) => r1.id !== r2.id
Я заметил, что элементы, которые не обновляются, перерисовываются, даже если я использую shouldComponentUpdate
.
После некоторых следов я обнаружил, что, поскольку я сортирую элементы по-разному перед клонированием источника данных (новое сообщение заставляет элементы переходить в начало списка), rowHasChanged
сравнивает разные строки. Есть смысл это сделать.
Но разве нет решения для эффективной сортировки? В WPF у нас был CollectionViewSource
, который получил что-то для сортировки в дополнение к своим данным из-за той же проблемы (также поддерживается фильтрация и другие).
Кто-нибудь знает способ избавиться от этих избыточных рендеров?
ListViewDataSource
использует неизменяемые данные, поэтому я не думаю, что это возможно с использованиемListView
. Однако, если у вас включенremoveClippedSubviews
, не похоже, что он должен отображать очень много строк. Вы пробовали это? - person Garrett McCullough   schedule 05.02.2017removeClippedSubviews
, не имеет большого значения, что вы повторно отображаете все строки, потому что вы будете повторно отображать только видимые строки (плюс несколько дополнительных с каждой стороны), поэтому он должен не вызывает проблемы с производительностью. Вы также можете взглянуть на некоторые альтернативы ListView. - person Garrett McCullough   schedule 03.04.2017rowHasChanged
, чтобы знать, какие строки должны быть перерисованы. Вы правы, говоря, что я должен брать цену повторного рендеринга только для моих видимых строк, но все же, если у меня есть 2 видимых строки, которые меняют свои позиции в моих данных (с индекса 0 на 1 или что-то), они оба будут повторно визуализировался, хотя никогда не менялся. Просто сменил позицию. - person Moti Azu   schedule 03.04.2017