Android TV: как уведомить об изменении элементов Card Presenter
Итак, я делаю экран с помощью фрагмента просмотра Leanback и CardPresenter.
Внутри моего фрагмента, который расширяет BrowseFragment, у меня есть метод для рисования пользовательского интерфейса:
private void loadCardRows() {
mRowsAdapter = new CustomArrayObjectAdapter(new ListRowPresenter());
final List<UiType> uiTypeList = new ArrayList<>(uiTypes);
for (UiType uiType : uiTypeList) {
HeaderItem cardPresenterHeader = new HeaderItem(0, uiType.getName());
List<TypeReportItem> items = performUiTypeFiltering(uiType.getEndpointType());
CardPresenter cardPresenter = new CardPresenter(attributesHelper);
CustomArrayObjectAdapter cardRowAdapter = new CustomArrayObjectAdapter(cardPresenter);
for (TypeReportItem item : items) {
cardRowAdapter.add(item);
}
mRowsAdapter.add(new ListRow(cardPresenterHeader, cardRowAdapter));
}
setAdapter(mRowsAdapter);
}
Теперь у меня есть служба, которая загружает некоторые данные каждые несколько секунд. Эти данные доступны через attributeHelper, который я передаю в CardPresenter. Как я могу перезагрузить эти данные, не заставляя экран мигать каждые несколько секунд?
3 ответа
mRowAdapter.notifyArrayItemRangeChanged(startingIndex, mRowAdapter.size());
Начальный индекс - это позиция, с которой вы обновляете данные. Не задавайте начальный индекс примерно 0, что приведет к миганию экрана от индекса 0.
Может быть, этот ответ будет полезен
for (int i = 0; i < mAdapter.size(); i++) {
ListRow listRow = ((ListRow) mAdapter.get(i));
ArrayObjectAdapter listRowAdapter = ((ArrayObjectAdapter) listRow.getAdapter());
if (listRowAdapter.size() > 0) {
listRowAdapter.notifyArrayItemRangeChanged(0, listRowAdapter.size());
}
}
Android TV -Перегрузка данных адаптера
Я использовал этот код в своем проекте. Моргание не произошло.
notifyArrayItemRangeChanged
вызвало мигание, поэтому попробуйте этот адаптер
class RefreshableArrayObjectAdapter(presenterSelector: PresenterSelector) :
ArrayObjectAdapter(presenterSelector) {
fun refresh() {
notifyChanged()
}
}