Как избежать дублирования элементов в Android ArrayObjectAdapter - PullRequest
0 голосов
/ 10 сентября 2018

Я добавляю элементы к Android (Kotlin) адаптеру, расширяющему ArrayObjectAdapter. Я использую addAll для добавления предметов.

Из ArrayObjectAdapter:

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

Мой вопрос: как избежать дублирования элементов в адаптере? Проблема в том, что резервный сбор данных для ArrayObjectAdapter представляет собой список (не набор), и когда я использую addAll, можно добавить дублирующий элемент. Я могу использовать addAll с LinkedHashSet (так как он принимает коллекцию в качестве входных данных), но если я добавлю еще один hashset, он может иметь дубликаты с 1-м hashset, поэтому мне все еще нужно проверить весь список. Конечно, я могу просматривать все элементы списка каждый раз, когда добавляю что-то, но это не очень хорошее решение по понятным причинам. Есть ли эффективный способ предотвращения дублирования в этом сценарии? Благодарю.

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете использовать DiffUtil в своем адаптере.

Это документы об этом Ссылка .

DiffUtil - это служебный класс, который может вычислять разницу между два списка и выводят список операций обновления, который преобразует первый список во второй.

Может использоваться для расчета обновлений для адаптера RecyclerView. Увидеть ListAdapter и AsyncListDiffer, которые могут вычислять различия, используя DiffUtil в фоновом потоке.

Это образец DiffUtil:

class ArticleListDiffTool(internal var oldList: List<Product>, internal var newList: List<Product>) : DiffUtil.Callback() {

    private val TAG = "ArticleListDiffTool"

    override fun getOldListSize(): Int {
        return oldList.size
    }

    override fun getNewListSize(): Int {
        return newList.size
    }

    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return oldList[oldItemPosition].id === newList[newItemPosition].id
    }

    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return oldList[oldItemPosition].id === newList[newItemPosition].id
    }


}

Вам нужно только передать свой старый и новый список.

Надеюсь, это помогло.

...