Я пытаюсь реализовать макет, содержащий вертикальный RecyclerView
, который сам содержит несколько горизонтальных RecyclerViews
(представьте новостной сайт с несколькими разделами новостей, где каждый раздел содержит несколько новостей, которые можно прокручивать по горизонтали) ,RecyclerView of RecyclerViews: Загрузка изображения
Горизонтальный RecyclerView
содержит (между прочим) ImageView
. Я ищу оптимальную стратегию загрузки изображения из URL-адреса в этот ImageView
.
Во-первых, мой код. Адаптер для внешнего RecyclerView:
@Override
public ItemRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.content_preview_list_item, null);
ItemRowHolder mh = new ItemRowHolder(v);
mh.recycler_view_list.setAdapter(new SectionListDataAdapter(mContext, listener, new ArrayList<ContentPreviewButtonItem>()));
mh.recycler_view_list.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
return mh;
}
@Override
public void onBindViewHolder(ItemRowHolder itemRowHolder, int i) {
Log.d("RecyclerViewDataAdapter", "onBindViewHolder");
final String sectionName = dataList.get(i).getTitle();
ArrayList singleSectionItems = dataList.get(i).getItems();
itemRowHolder.itemTitle.setText(sectionName);
((SectionListDataAdapter)itemRowHolder.recycler_view_list.getAdapter()).setItemList(singleSectionItems);
itemRowHolder.recycler_view_list.getAdapter().notifyDataSetChanged();
itemRowHolder.recycler_view_list.setHasFixedSize(true);
}
И для внутреннего RecyclerView, который содержит изображение:
@Override
public SingleItemRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
Log.d("SectionListDataAdapter", "onCreateViewHolder");
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.content_preview_item, null);
SingleItemRowHolder mh = new SingleItemRowHolder(v);
return mh;
}
@Override
public void onBindViewHolder(SingleItemRowHolder holder, int i) {
Log.d("SectionListDataAdapter", "onBindViewHolder");
ContentPreviewButtonItem singleItem = itemsList.get(i);
Uri imageUri = Uri.parse(singleItem.getImageUrl());
holder.itemImage.setImageURI(imageUri); //itemImage is a SimpleDraweeView
}
Хотя этот код прекрасно работает на мобильном телефоне, есть заметное отставание на планшете, когда многократные внутренний RecyclerViews
и изображения загружаются сразу. Прямо сейчас я использую библиотеку Fresco Facebook для загрузки изображения в SimpleDraweeView
. Я также попробовал Picasso, но это дало OutOfMemoryException
, когда сразу нужно было загрузить несколько изображений. Я улучшил производительность, перемещая создание адаптера внутреннего RecyclerViews
в onCreateViewHolder
вместо onBindViewHolder
, но отставание по-прежнему заметно.
Что является лучшей стратегией или библиотекой для загрузки изображений в этом сценарии. Благодаря
Glide является идеально подходит для этого я считаю, с помощью которого вы можете изменить размер изображения, пока изображение загружается, вы можете отображать миниатюру того же – silverFoxA
. Вы можете использовать то же самое, используя Picasso. Я не уверен, что я могу ожидать улучшения производительности от использования Glide. Или есть причина, по которой вы порекомендуете Glide вместо Picasso, Fresco и т. Д.? – Androidicus
Я использую скольжение в течение долгого времени, и это кеширование и большая способность обработки изображений действительно удивительна. – silverFoxA