Java 无法从RecyclerView中的URL加载图像

Java 无法从RecyclerView中的URL加载图像,java,android,url,android-recyclerview,android-glide,Java,Android,Url,Android Recyclerview,Android Glide,我似乎不明白为什么我无法加载任何类型的图像(我尝试了多个URL)。我尝试过使用AsyncTask类,但问题仍然没有得到解决。下面列出了我的适配器类,任何帮助都将不胜感激 我试图为每个RecyclerView条目加载一个映像(在这个测试用例中,相同的映像)。当我不尝试设置从URL派生的图像时,将显示默认视图(橙色正方形),但如果我尝试设置,则ImageView将保持空白 入口适配器 public class EntryAdapter extends RecyclerView.Adapter<

我似乎不明白为什么我无法加载任何类型的图像(我尝试了多个URL)。我尝试过使用AsyncTask类,但问题仍然没有得到解决。下面列出了我的适配器类,任何帮助都将不胜感激

我试图为每个RecyclerView条目加载一个映像(在这个测试用例中,相同的映像)。当我不尝试设置从URL派生的图像时,将显示默认视图(橙色正方形),但如果我尝试设置,则ImageView将保持空白

入口适配器

public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.EntryViewHolder> {
private Entry[] mDataset;

// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class EntryViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public String source;
    public TextView textContent, title, label, author;
    public ImageView thumbnail;
    public CardView topCard, mainCard;
    public EntryViewHolder(View v) {
        super(v);
        title = v.findViewById(R.id.title);
        textContent = v.findViewById(R.id.textContent);
        topCard = v.findViewById(R.id.top_card);
        mainCard = v.findViewById(R.id.main_card);
        thumbnail = mainCard.findViewById(R.id.thumbnail);
        author = mainCard.findViewById(R.id.author);
        label = topCard.findViewById(R.id.label);
    }
}

// Provide a suitable constructor (depends on the kind of dataset)
public EntryAdapter(Entry[] myDataset) {
    mDataset = myDataset;
}

// Create new views (invoked by the layout manager)
@Override
public EntryAdapter.EntryViewHolder onCreateViewHolder(ViewGroup parent,
                                                 int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.entry_item_constraints, parent, false);

    EntryViewHolder vh = new EntryViewHolder(v);
    return vh;
}

// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(EntryViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    holder.title.setText(mDataset[position].getTitle());
    holder.label.setText(mDataset[position].getLabel());
    holder.textContent.setText(mDataset[position].getTextContent());
    holder.thumbnail.setImageDrawable(LoadImageFromWebOperations(mDataset[position].getThumbnail()));
    holder.author.setText(mDataset[position].getAuthor());

    //new DownloadImageTask(holder.thumbnail).execute(mDataset[position].getThumbnail());
}

// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
    return mDataset.length;
}

public static Drawable LoadImageFromWebOperations(String url) {
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "reddit_thumbnail");
        return d;
    } catch (Exception e) {
        return null;
    }
}
}
公共类EntryAdapter扩展了RecyclerView.Adapter{
私有条目[]mDataset;
//提供对每个数据项的视图的引用
//复杂数据项可能需要每个项有多个视图,并且
//您可以访问视图持有者中数据项的所有视图
公共静态类EntryViewHolder扩展了RecyclerView.ViewHolder{
//在本例中,每个数据项只是一个字符串
公共字符串源;
公共文本查看文本内容、标题、标签、作者;
公共图像视图缩略图;
公共卡查看topCard、mainCard;
公共入口视图支架(视图v){
超级(五);
title=v.findViewById(R.id.title);
textContent=v.findviewbyd(R.id.textContent);
topCard=v.findviewbyd(R.id.top_卡);
主卡=v.findviewbyd(R.id.main_卡);
缩略图=mainCard.findViewById(R.id.thumbnail);
author=mainCard.findviewbyd(R.id.author);
标签=topCard.findViewById(R.id.label);
}
}
//提供合适的构造函数(取决于数据集的类型)
公共入口适配器(条目[]myDataset){
mDataset=myDataset;
}
//创建新视图(由布局管理器调用)
@凌驾
public EntryAdapter.EntryViewHolder onCreateViewHolder(视图组父级、,
int视图类型){
//创建新视图
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.entry\u item\u约束,父项,false);
入口视图支架vh=新入口视图支架(v);
返回vh;
}
//替换视图的内容(由布局管理器调用)
@凌驾
BindViewHolder上的公共无效(EntryViewHolder,内部位置){
//-在此位置从数据集中获取元素
//-用该元素替换视图的内容
holder.title.setText(mDataset[position].getTitle());
holder.label.setText(mDataset[position].getLabel());
holder.textContent.setText(mDataset[position].getTextContent());
holder.thumbnail.setImageDrawable(LoadImageFromWebOperations(mDataset[position].getThumbnail());
holder.author.setText(mDataset[position].getAuthor());
//新建下载的ImageTask(holder.thumbnail).execute(mDataset[position].getThumbnail());
}
//返回数据集的大小(由布局管理器调用)
@凌驾
public int getItemCount(){
返回mDataset.length;
}
公共静态可绘制LoadImageFromWebOperations(字符串url){
试一试{
InputStream为=(InputStream)新URL(URL).getContent();
Drawable d=Drawable.createFromStream(是“reddit_缩略图”);
返回d;
}捕获(例外e){
返回null;
}
}
}
尝试使用在
RecyclerView
中显示图像,该视图处理延迟加载以使列表滚动更平滑。当列表滚动时,它还取消了加载操作,以提高性能和资源消耗

Glide.with(holder.thumbnail.getContext())
         .load(mDataset[position].getThumbnail())
         .into(holder.thumbnail);
应用程序内级别build.gradle:

repositories {
    mavenCentral()
    google()
}

dependencies {
    implementation 'com.github.bumptech.glide:glide:4.8.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}

您还可以使用
placeholder()
方法指定图像(例如,它可能指向使用资源id绘制的图像),以便在目标图像未下载或不可用时显示该图像。

尝试使用毕加索进行图像检索谢谢您的帮助!但是,当我运行应用程序时,它仍然只是显示默认值。当图像文件太大时,这是预期的行为吗?不过,我很怀疑这是真的。不客气:)如果图像太大,下载它需要更长的时间是合理的。Glide按所需大小调整图像大小并将其缓存,以备下次使用。但是,请使用您的浏览器检查图像url以确保它存在。是的,url将我带到图像。是否有我必须链接到的特定类型的图像?当然:似乎一切正常:-请将资源图像传递给glide并检查其他所有内容。(比如:
Glide.with(holder.thumbnail.getContext()).load(R.drawable.somthing).into(holder.thumbnail);