Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android DiffUtils的一个缺点_Android_Android Recyclerview - Fatal编程技术网

android DiffUtils的一个缺点

android DiffUtils的一个缺点,android,android-recyclerview,Android,Android Recyclerview,我发现互联网上关于DiffUtil的所有信息都是关于如何使用DiffUtil的。 有人认为使用DiffUtil会导致大量内存消耗吗? 如果我有一个包含5000个对象(例如:post)的列表,那么我会滚动RecyclerView并再加载40个对象。这意味着如果使用DiffUtil,内存将保存两个列表(旧列表包含5000个对象,新列表包含5040个对象)。因此,在加载数据时,应用程序会大量消耗内存。 解决这个问题的方法是不要持有两份清单。显示如下: DiffUtil.DiffResult recyc

我发现互联网上关于DiffUtil的所有信息都是关于如何使用DiffUtil的。 有人认为使用DiffUtil会导致大量内存消耗吗?
如果我有一个包含5000个对象(例如:post)的列表,那么我会滚动RecyclerView并再加载40个对象。这意味着如果使用DiffUtil,内存将保存两个列表(旧列表包含5000个对象,新列表包含5040个对象)。因此,在加载数据时,应用程序会大量消耗内存。 解决这个问题的方法是不要持有两份清单。显示如下:

DiffUtil.DiffResult recyclerViewDiff = DiffUtil.calculateDiff(new DiffUtil.Callback() {
            @Override
            public int getOldListSize() {
                return oldelist.size();
            }

            @Override
            public int getNewListSize() {
                return oldlist.size() + increasedData.size();
            }

            @Override
            public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
                boolean isIncreaseDataPos = newItemPosition >= oldlist.size();
                newItemPosition = !isIncreaseDataPos ? newItemPosition : newItemPosition - oldlist.size();

                Object newItem = !isIncreaseDataPos ? oldlist.get(newItemPosition) : increaseData.get(newItemPosition);
                return oldlist.get(oldItemPosition).equals(newItem);
            }

            @Override
            public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
                return ...;
            }
        });

但如果我更改列表中的项目(而不是添加更多数据),该怎么办?除了我自己使用notifyItemChanged(position)之外,有没有其他方法可以使用DiffUtil而不用保存两个列表来更新视图?

但是如果你确切知道什么发生了变化,那么你需要什么呢
DiffUtil
?你的意思是我们有
notifyItemChanged()
notifyItemInserted
notifyItemMoved
等等,那么我们不需要
DiffUtil
?我们使用它只是因为它方便不因为我们不知道到底发生了什么变化。
DiffUtil
只需查找更改、插入、移动和删除了哪些项目,如果您已经知道,那么您根本不需要
DiffUtil
——文档中说:“DiffUtil是一个实用程序类,它可以计算两个列表之间的差异,并输出一个更新操作列表,将第一个列表转换为第二个列表。”但是如果您确切知道发生了什么变化,那么您需要什么呢
notifyItemInserted
notifyItemMoved
等等,那么我们就不需要
DiffUtil
?我们使用它只是因为它很方便,不是因为我们不知道到底发生了什么变化。
DiffUtil
只需查找哪些项目被更改、插入、移动和删除,如果您已经知道,那么您就不需要e> DiffUtil
——文档中说:“DiffUtil是一个实用程序类,可以计算两个列表之间的差异,并输出一个更新操作列表,将第一个列表转换为第二个列表。”