Picasso在安卓中无法与Recycler View配合使用。

7

我正在开发一个简单的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);
}

但是它不起作用!我用单个URL测试了Picasso,它可以正常工作,但是当我将图像链接设置为数组列表时,它就无法工作。


确保rssItems包含有效的条目,即它们的URL不为空,并且可以通过Web浏览器加载图像。 - aga
我检查了一下,rssItems中有有效的地址,而且它们都能正常工作。当我使用其中一个rssItem地址(例如:Picasso.with(F.context).load("http://www.example.com").into(viewHolder.postImage);)时,它可以正常工作。但当我设置item.imageLink时,它就不能正常工作。 - Farzad Farazmand
请完整准确地解释“它不起作用”是什么意思。 - CommonsWare
意味着 Picasso 无法下载图片! - Farzad Farazmand
请查看以下教程,了解如何使用Picasso库在RecyclerView中加载图片:check this tutorial - Navneet Krishna
6个回答

8

你看过这篇文章吗?它是关于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()));
}

3

当我想使用API在扩展的RecyclerView.Adapter和RecyclerView.ViewHolder中加载来自其URL的图像时,我遇到了同样的问题。

首先,您必须检查URL是否为空或null,然后使用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以及它是如何被找到的。它可能为空或未正确找到id视图。

2

仅使用简单的代码:

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

但是,如果您还想要图像成为图标,或者需要位置信息,那么我们将在此代码中使用一些附加代码。


1
我曾经被这个问题困扰了一段时间,但在网上阅读资源后解决了它。 以下是我的解决方案。 我将解决您在ViewHolder类中声明的ImageView加载图像的问题。
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);
}

这是我使用过的方法,希望对你也有用。祝你好运。

1

请注意,您需要在 Android 清单文件中设置以下内容,才能使 Picasso 加载通过 URL 获取的任何图片。 答案更新:

如果要让 Picasso 从 URL 加载图像(例如 https://picsum.photos/900/900?image=0),则需要设置正确的权限,您需要在 Android 清单文件中进行设置……因此,在 Java 中,您将拥有以下代码:

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

但这可能不会加载任何图像,看起来好像 Picasso 不起作用... 所以你需要更新 AndroidManifest.xml,在清单标签下方添加以下内容...:

<uses-permission android:name="android.permission.INTERNET" />

这需要更多的信息,以便“普通人”理解它。 - elbrant
1
更新了答案并添加了更多细节。对我来说,只需要更新权限就可以让 Picasso 正常工作了。 - Linda Gcaba

0
如果你正在从互联网加载图片,请确保在AndroidManifest.xml中添加了INTERNET权限。
<uses-permission android:name="android.permission.INTERNET"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接