Picasso не работает с Recycler View в Android

Я разрабатываю простую программу для чтения RSS, и я хочу показать заголовок и изображение каждого сообщения в представлении переработчика.

Вот где я использую Picasso для загрузки изображений из ArrayList:

public void onBindViewHolder(ViewHolder viewHolder, int i) {
    RssItem item = rssItems.get(i);
    Picasso.with(F.context).load(item.imageLink).into(viewHolder.postImage);
    viewHolder.postTitle.setText(item.title);
    viewHolder.postAuthor.setText(item.postWriter);
    viewHolder.postDate.setText(item.pubDate);
}

но это не работает! Я тестирую Picasso с одним URL-адресом, и он работает правильно, но при установке ссылок на изображения в списке массивов он не работает.


person Farzad Farazmand    schedule 06.02.2015    source источник
comment
Убедитесь, что rssItems содержит допустимые элементы, т.е. их URL-адреса не пусты, а изображения могут быть загружены, например, через веб-браузер.   -  person aga    schedule 06.02.2015
comment
я проверил, что в rssItems есть действительные адреса, и все они работают, когда я использую Picasso с одним из адресов из rssItem (например: Picasso.with(F.context).load(example.com).into(viewHolder.postImage); ) это работает, но когда я устанавливаю item.imageLink , это не работает.   -  person Farzad Farazmand    schedule 06.02.2015
comment
Пожалуйста, объясните полностью и точно, что это не работает означает.   -  person CommonsWare    schedule 06.02.2015
comment
означает, что Пикассо не загружает изображение!   -  person Farzad Farazmand    schedule 06.02.2015
comment
ознакомьтесь с этим руководством, чтобы узнать, как для загрузки изображений в recyclerview с помощью библиотеки picasso   -  person Navneet Krishna    schedule 06.01.2019


Ответы (6)


У меня была такая же проблема, когда я хотел загрузить изображение с его URL-адреса с помощью API в расширенных RecyclerView.Adapter и RecyclerView.ViewHolder.

Прежде всего, вы должны проверить, что URL-адрес не может быть пустым или нулевым, а затем загрузить его с помощью Picasso.

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
      RssItem item = rssItems.get(i);
      if(item.imageLink!=null && !item.imageLink.isEmpty()) {
          Picasso.with(F.context)
              .load(item.imageLink)
              .placeholder(R.drawable.default_placeholder)
              .error(R.drawable.error_placeholder)
              // To fit image into imageView
              .fit()
              // To prevent fade animation
              .noFade()
              .into(viewHolder.postImage);
     } else {  
          viewHolder.postImage.setImageDrawable(ContextCompat.getDrawable(F.context,R.drawable.default_placeholder));
     }
     viewHolder.postTitle.setText(item.title);
     viewHolder.postAuthor.setText(item.postWriter);
     viewHolder.postDate.setText(item.pubDate);
}

Наконец, вы должны знать о viewHolder.postImage и о том, как его найти. Это может быть нуль или не найдено правильное представление по идентификатору.

person KeyOne    schedule 28.06.2016

Вы видели эту статью? Речь идет о RecyclerView. Автор использует Picasso в адаптере.

@Override
public void onBindViewHolder(FeedListRowHolder feedListRowHolder, int i) {
    FeedItem feedItem = feedItemList.get(i);

    Picasso.with(mContext).load(feedItem.getThumbnail())
            .error(R.drawable.placeholder)
            .placeholder(R.drawable.placeholder)
            .into(feedListRowHolder.thumbnail);

    feedListRowHolder.title.setText(Html.fromHtml(feedItem.getTitle()));
}
person LissF    schedule 08.04.2015

используйте простой код:

 @Override
    public void onBindViewHolder(ShivaViewholder holder, int position) {
    Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(holder.imageView2);
    }

Но если вы также хотите изображение в значке или хотите местоположение, мы будем использовать дополнительный код в этом коде.

person Pradeep Sheoran    schedule 09.08.2018

Я застрял с этой вещью на некоторое время, но разобрался после прочтения ресурса в Интернете. Это то, что вам нужно сделать, что сработало для меня. Я просто решу вашу проблему с загрузкой изображения в режиме просмотра изображений, который вы объявили в своем классе ViewHolder.

public void onBindViewHolder(ViewHolder viewHolder, int i) {
    Context context = viewHolder.postImage.getContext(); //<----- Add this line
    RssItem item = rssItems.get(i);

    //change context here
    Picasso.with(context).load(item.imageLink).into(viewHolder.postImage);

    viewHolder.postTitle.setText(item.title);
    viewHolder.postAuthor.setText(item.postWriter);
    viewHolder.postDate.setText(item.pubDate);
}

Это то, что сработало для меня, и я надеюсь, что это сработает и для вас. Удачи.

person Prateek Raina    schedule 23.10.2016

Просто обратите внимание, что вам нужно иметь эту настройку в манифесте Android, чтобы Пикассо мог загружать любое изображение через URL-адрес. Обновление ответа:

Для Picasso для загрузки изображений с URL-адресов, например. https://picsum.photos/900/900?image=0. Он должен иметь правильные разрешения, которые вам нужно установить в файле манифеста Android... Итак, в вашей Java у вас будет:

Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);

но это может не загружать какие-либо изображения и выглядеть так, как будто Пикассо не работает... поэтому вам нужно обновить AndroidManifest.xml и чуть ниже тега манифеста добавить следующее...:

<uses-permission android:name="android.permission.INTERNET" />
person Linda Gcaba    schedule 29.03.2019
comment
Это требует больше информации для среднего человека, чтобы понять это. - person elbrant; 30.03.2019
comment
обновил ответ более подробно ... что касается меня, это был просто вопрос обновления разрешений. заставить Пикассо работать. - person Linda Gcaba; 30.03.2019

Если вы загружаете изображения из Интернета, убедитесь, что вы добавили разрешение для ИНТЕРНЕТА в свой AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/>
person KirillParfenov    schedule 27.10.2019