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