Picasso 在 android 中无法使用 Recycler View

Picasso does not work with Recycler View in android

我开发了一个简单的 RSS reader,我想在回收站视图中显示每个 post 的标题和图像。

我在其中使用 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,它工作正常,但是当在数组列表中设置图像链接时,它不起作用。

你见过this article吗?这是关于 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()));
}

当我想从扩展 RecyclerView.Adapter 和 RecyclerView.ViewHolder.

中使用 API 加载图像时,我遇到了同样的问题

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

我被这件事困扰了一段时间,但在阅读了在线资源后才对它进行了排序。 这就是你需要做的,对我有用。 我将解决您在 ViewHolder class 中声明的图像视图中加载图像的问题。

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);
}

这对我有用,我希望它对你也有用。祝你好运。

只使用一个简单的代码:

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

但是如果您还想要图标中的图像,或者想要位置,那么我们将在此代码中使用一些额外的代码。

请注意,您需要在 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 并在清单标签下方添加以下内容...:[=​​13 =]

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

如果您从 Internet 加载图像 - 请确保您已在 AndroidManifest.xml:

中添加了 INTERNET 权限
<uses-permission android:name="android.permission.INTERNET"/>