首页 文章

如何避免Android ArrayObjectAdapter中的重复元素

提问于
浏览
0

我正在向 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 的后备数据收集是一个List(不是Set),当我使用 addAll 时,可以添加一个重复的元素 . 我可以使用 addAllLinkedHashSet (因为它需要一个Collection作为输入),但如果我添加另一个 hashset 它可能与第一个 hashset 重复,所以我仍然需要检查整个列表 . 我当然可以在每次添加内容时浏览所有列表元素,但由于显而易见的原因,这不是一个好的解决方案 . 在这种情况下是否有一种有效的方法来防止重复?谢谢 .

1 回答

  • 0

    您可以在适配器中使用 DiffUtil .

    这是关于Link的文件 .

    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
        }
    
    
    }
    

    您只需要传递旧的和新的列表 .

    希望这有帮助 .

相关问题