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 中,您就可以加载全分辨率照片。
我想创建相册的回收视图,当用户点击相册时,它会扩展为显示该相册中图像的网格布局。
例如,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 中,您就可以加载全分辨率照片。