Android 未从recyclerview中的URL正确加载图像

Android 未从recyclerview中的URL正确加载图像,android,android-recyclerview,Android,Android Recyclerview,我有一个带有GridLayoutManager的Recyclerview。Recyclerview中的列表项从包含Name和图像URL的URL加载简单的JSON。为了从接收到的URL异步加载图像,我遵循了本教程。当我的应用程序第一次加载时,这就是我看到的 当我浏览到另一个活动并返回时,这就是我看到的。 这是我的适配器,用于回收视图 public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesViewHold

我有一个带有GridLayoutManager的
Recyclerview
Recyclerview
中的列表项从包含
Name
图像URL
的URL加载简单的
JSON
。为了从接收到的URL异步加载图像,我遵循了本教程。当我的应用程序第一次加载时,这就是我看到的

当我浏览到另一个活动并返回时,这就是我看到的。

这是我的
适配器
,用于
回收视图

public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesViewHolder> {

    private LayoutInflater inflater;
    private CategoriesViewHolder viewHolder;
    private ArrayList<Categories> categoriesList = new ArrayList<>();
    private VolleySingleton volleySingleton;
    private ImageLoader imageLoader;

    public CategoriesAdapter(Context context){
        inflater = LayoutInflater.from(context);
        volleySingleton = VolleySingleton.getsInstance();
        imageLoader = volleySingleton.getImageLoader();
    }

    public void setCategoriesList(ArrayList<Categories> categoriesList){
        this.categoriesList = categoriesList;
        notifyItemRangeChanged(0, categoriesList.size());
    }

    @Override
    public CategoriesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.categories_list, parent, false);
        viewHolder = new CategoriesViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(CategoriesViewHolder holder, int position) {
        Categories current = categoriesList.get(position);
        viewHolder.categoryName.setText(current.categoryName);

        imageLoader.get(current.icon_url, new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
                viewHolder.categoryIcon.setImageBitmap(response.getBitmap());
            }

            @Override
            public void onErrorResponse(VolleyError error) {
                //viewHolder.contactIcon.setImageResource(R.drawable.image);
            }
        });
    }

    @Override
    public int getItemCount() {
        return categoriesList.size();
    }
}

我个人建议你使用这个图书馆,而不是自己做所有繁重的工作

加载图像就这么简单

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

很难说为什么你会看到你所看到的,但是有一些问题使得这种方法不太实用

在BindViewHolder中的

  • 检查位图是否已存在(例如,在内存缓存中)。如果有,请调用
    ImageView.setImageBitmap
  • 如果不是,则从磁盘或网络异步加载。加载完成后,不要直接设置视图,而是更新内存缓存并向适配器发送数据集已更改的信号(例如,通过
    BaseAdapter.notifyDataSetChanged
    )。理想情况下,您只想更新已更改的视图,
    RecyclerView.Adapter
    允许通过
    notifyItemChanged
    进行更新。这两个“notify”方法都会导致调用
    onBindViewHolder
    ,这一次,步骤1应该会成功
  • 话虽如此,请使用第三方库,如前一位作者所推荐的(我偏爱)。它使事情变得相当容易,也不太可能让你射中自己的脚——而且在实现自定义图像加载/缓存时存在许多问题。

    好的,这很管用。谢谢!!:)但是我想知道我的代码有什么问题。
    Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);