我有一个返回JSON的API,我想从这个API提供的URL加载一个Image。应将图像传递到适配器以进行回收视图。 现在所有包含Imgae_URL的项目都被我的适配器跳过,我真的不明白为什么。
if (json_img_url.isNotEmpty()) {
Executors.newSingleThreadExecutor().execute({
val conn = URL(json_img_url).openConnection()
conn.connect()
val iStream:InputStream = conn.getInputStream()
val img_bitmap:Bitmap? = BitmapFactory.decodeStream(iStream)
newItems.add(Item(....img_bitmap))
})
....
itemArrayAdapter.addItems(newItems)
网址:"https://s3.us-east-2.amazonaws.com/c...."
使用的URls是有效的,S3 Bucket上的图像都是公开的。
If statment返回true
(我用Log.d
检查了)但是项目没有出现在手机上,我没有发现错误,应用程序没有崩溃,就像Item永远不会那里...
我知道有像Picasso或Glide这样的图书馆,但即便如此,我也无法让它发挥作用,说实话我想完成这项任务而无需安装额外的套装,只是感觉不对。
答案 0 :(得分:1)
与ListView不同,无法直接通过RecyclerView适配器添加或删除项目。您需要直接更改数据源并通知适配器任何更改。在向适配器通知不同更改时,可以使用许多方法:
每次我们想要在RecyclerView中添加或删除项目时,我们都需要明确告知适配器事件。与ListView适配器不同,RecyclerView适配器不应该依赖notifyDataSetChanged(),因为应该使用更细粒度的操作。有关详细信息,请参阅API documentation。
此外,如果您打算更新现有列表,请确保在进行任何更改之前获取当前项目数。例如,应该调用适配器上的getItemCount()
来记录将要更改的第一个索引。
// record this value before making any changes to the existing list
int curSize = itemArrayAdapter.getItemCount();
// update the existing list
newItems.add(Item(....img_bitmap));
// curSize should represent the first element that got added
// newItems.size() represents the itemCount
itemArrayAdapter.notifyItemRangeInserted(curSize, newItems.size());