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

RecyclerView inside RecyclerView, app crashing due to high memory consumption

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

例如,non-expanded:

并展开:

外部 recyclerView item 的布局仅包含一个 textView、checkbox 和一个不可见的 recyclerview,单击该项目时变为可见。

我这样声明 outerAdapter:

photosVideosAdapter = new PhotosVideosAdapter(getContext(),new ArrayList<PhoneAlbum>());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(photosVideosAdapter);

这里是外适配器的onBindViewHolder:

holder.tvFolder.setText(phoneAlbums.get(position).getName());
ArrayList<PhonePhoto> phonePhotos = phoneAlbums.get(position).getAlbumPhotos();
InnerAdapter innerAdapter = new InnerAdapter(context, phonePhotos);
holder.innerRecyclerView.setHasFixedSize(true);
holder.innerRecyclerView.setLayoutManager(new GridLayoutManager(context,3));
holder.innerRecyclerView.setAdapter(innerAdapter);
.... OnClickMethod to toggle visibility of innerRecyclerView

以及内部适配器的 onBindViewHolder:

Glide.with(context)
        .load(phonePhotos.get(position).getPhotoUri())
        .override(200,200)
        .into(holder.imgThumbnail);

问题是,如果内部recyclerView 包含超过200 个项目,应用程序会由于高内存使用而崩溃。但如您所见,我正在使用 glide 加载图像,而且 RecyclerView 不应一次创建所有视图。但是,我可以看到内部 RecyclerView 正在同时创建所有项目视图,这导致应用程序崩溃。

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

尝试将此添加到您的 manifest.xml

        android:largeHeap="true"

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

我使用带有动画和多视图类型的插入和删除重写了整个逻辑。 它将涉及一些额外的代码来管理它。不过结果还是比较满意的。

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

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

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

我假设您还以原始质量提取所有照片,因此 phone 的 RAM 中同时存储 200 多张全尺寸照片可能是崩溃的原因。

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