Android RecyclerView内部的RecyclerView,应用程序因内存消耗过高而崩溃

Android RecyclerView内部的RecyclerView,应用程序因内存消耗过高而崩溃,android,android-recyclerview,android-viewholder,nestedrecyclerview,Android,Android Recyclerview,Android Viewholder,Nestedrecyclerview,我想创建一个相册的回收视图,当用户点击相册时,它会扩展到显示相册中图像的网格布局 例如,非扩展: 并扩大: 外部recyclerView项的布局仅包含一个文本视图、复选框和一个不可见的recyclerView,该视图在单击该项时变为可见 我是这样宣布外雷达的: photosVideosAdapter = new PhotosVideosAdapter(getContext(),new ArrayList<PhoneAlbum>()); recyclerView.setLayout

我想创建一个相册的回收视图,当用户点击相册时,它会扩展到显示相册中图像的网格布局

例如,非扩展:

并扩大:

外部recyclerView项的布局仅包含一个文本视图、复选框和一个不可见的recyclerView,该视图在单击该项时变为可见

我是这样宣布外雷达的:

photosVideosAdapter = new PhotosVideosAdapter(getContext(),new ArrayList<PhoneAlbum>());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(photosVideosAdapter);
问题在于,如果Internal recyclerView包含的项目超过200个,则应用程序会因内存使用率高而崩溃。但正如您所见,我使用glide加载图像,而且RecyclerView不应该一次创建所有视图。但是,我可以看到,内部的RecyclerView正在一次创建所有项目视图,这导致应用程序崩溃


我如何解决这个问题?任何帮助都将不胜感激。

尝试将其添加到manifest.xml中

        android:largeHeap="true"


相信我,不要在recyclerview中使用recyclerview。 在我当前的应用程序中,我的同事使用嵌套的recyclerview构建了解决方案,我遇到了类似的情况

我使用带有动画和多视图类型的插入和删除重写了整个逻辑。 它将涉及一些额外的代码来管理它。但结果将相当令人满意


事实上,我在iOS collectionview中也使用了相同的逻辑。这两个平台上的应用程序都是实时的。

您的内存消耗可能很高,因为您使用以下命令一次从相册中检索了所有照片:

ArrayList<PhonePhoto> phonePhotos = phoneAlbums.get(position).getAlbumPhotos();
ArrayList phonePhotos=phoneAlbums.get(position.getAlbumPhotos();
我想你也在以原始质量提取所有照片,所以在手机的RAM上同时保存200多张全尺寸照片可能是导致崩溃的原因


解决此问题的一种方法是将照片的低分辨率预览加载到RAM中,一旦照片实际显示在RecyclerView中,就可以加载全分辨率照片。

问题不在于增加堆大小。问题是内部回收器视图一次创建所有视图,因此,如果相册中有4000张照片,它将一次创建所有4000个视图。可以测试这是否是问题的根本原因的一种方法是注释掉有关在RecylcerView中显示图片的所有代码,并查看内存使用率是否仍然很高。PhonePhoto仅包含图片的URI,并且所有图像的URI都已存储在ArrayList中。问题是内部回收器视图一次加载所有视图。所以,如果Internal recycler视图有1000个图像,所有图像都会一次加载,这不是recyclerView应该做的;返回,这应该是当前加载的视图数。对于innerRecyclerView,它等于图像数。问题是innerRecyclerView一次加载所有视图。因此,如果内部recyclerView有1000个图像,那么所有图像都会一次加载,这不是recyclerView应该做的。
        android:largeHeap="true"

ArrayList<PhonePhoto> phonePhotos = phoneAlbums.get(position).getAlbumPhotos();