Android TV -Перегрузка данных адаптера

Я хочу перезагрузить некоторые данные строки в фрагменте просмотра.

По сути, я хочу сбросить данные адаптера, не вызывая эффект вспышки во фрагменте обзора. Есть идеи, как это можно сделать?

Что-то вроде notifyDataSetChanged() в представлении списка.

Thanx

5 ответов

Это обновит данные без потери текущей позиции:

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());
    }
}

Вы можете создать свой собственный адаптер и добавить новый метод replaceAll().

public void replaceAll(Collection items){
 int itemsCount = items.size();
 if (itemsCount == 0){
    return;
 }
 mItems.clear();
 mItems.addAll(index, items);
 notifyItemRangeChanged(0, itemsCount);
}

полный источник: ссылка

Я ответил на что-то похожее в этом вопросе: динамически добавлять больше карточек в список Row android TV Lindback

Я скопирую свой ответ оттуда. Надеюсь, это поможет.

Добавить элементы в докладчик;

CardPresenter channelCardPresenter = new CardPresenter();
ArrayObjectAdapter channelRowAdapter = new ArrayObjectAdapter(channelCardPresenter);
channelRowAdapter.add(new Movie("Movie Title"));
HeaderItem header = new HeaderItem(0, "My Channels");
mRowsAdapter.add(new ListRow(header, channelRowAdapter));

Конечно, это может работать только в первый раз, когда вы создаете пользовательский интерфейс. Будущие времена не могут сделать это. В моем приложении https://github.com/Fleker/CumulusTV/blob/e85b7aa153fcd7bb5d1b23127a8002f3a8204120/app/src/main/java/com/felkertech/n/tv/LeanbackFragment.java, который будет каждый раз вызывать метод, я буду создавать Я хочу сделать полную перерисовку приложения:

public void refreshUI() {
    prepareBackgroundManager();
    setupUIElements();
    loadRows(); //Generate and populate all the rows
    setupEventListeners();
}

Вот моя kotlin версия ответа @ewilly, реализующая только replaceAll который я использую как для первоначального заполнения, так и для постепенного обновления списка.

class RefreshableArrayObjectAdapter(presenter: Presenter): ObjectAdapter(presenter) {
    var items: ArrayList<Any> = arrayListOf()

    override fun isImmediateNotifySupported(): Boolean = true

    override fun size(): Int = items.size

    override fun get(position: Int): Any = items[position]

    fun replaceAll(list: Collection<Any>) {
        items.clear()
        items.addAll(0, list)
        notifyChanged()
    }
}
  /**
 * Notify that the content of a range of items changed. Note that this is
 * not same as items being added or removed.
 *
 * @param positionStart The position of first item that has changed.
 * @param itemCount The count of how many items have changed.
 */
public void notifyArrayItemRangeChanged(int positionStart, int itemCount) {
    notifyItemRangeChanged(positionStart, itemCount);
}

Уведомить, что содержание ряда предметов изменилось. Обратите внимание, что * это не то же самое, что добавление или удаление элементов.

если вы хотите добавить или удалить элемент, попробуйте это:

1.mRowsAdapter.clear();
2.mRowsApdapter.addAll();
Другие вопросы по тегам