RecyclerView внутри RecyclerView, сбой приложения из-за высокого потребления памяти - PullRequest
0 голосов
/ 12 июля 2020
• 1000 1004 *enter image description here

and expanded:

введите описание изображения здесь

Макет внешнего элемента recyclerView содержит только textView, флажок и невидимый recyclerview, который становится видимым при щелчке по элементу.

Я объявил внешний адаптер следующим образом:

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 создает все представления элементов одновременно, что приводит к тому, что приложение ломает sh.

Как я могу исправить эту проблему? Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Поверьте мне, не go с recyclerview внутри recyclerview. У меня была аналогичная ситуация в моем текущем приложении, где мой коллега создал решение, используя вложенный recyclerview.

Я переписал весь logi c, используя вставку и удаление с анимацией и несколькими типами представления. Для управления им потребуется дополнительный код. Но результат был бы вполне удовлетворительным.

Фактически, я использовал тот же logi c в iOS collectionview. Приложение на обеих платформах работает.

0 голосов
/ 12 июля 2020

Ваше потребление памяти, вероятно, будет высоким, потому что вы извлекли все фотографии из альбома сразу со строкой:

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

Я предполагаю, что вы также загружаете все фотографии в их исходном качестве, поэтому имея 200+ полноразмерных фотографий в ОЗУ телефона одновременно могут быть причиной взлома sh.

Один из способов исправить это - загрузить в ОЗУ предварительный просмотр фотографий с более низким разрешением фотография фактически отображается в RecyclerView, вы можете загрузить фотографию с полным разрешением.

0 голосов
/ 12 июля 2020

Попробуйте добавить это в свой манифест. xml

        android:largeHeap="true"

...