通过URL将图像加载到RecyclerAdapter中

时间:2018-03-07 13:10:38

标签: android kotlin

我有一个返回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这样的图书馆,但即便如此,我也无法让它发挥作用,说实话我想完成这项任务而无需安装额外的套装,只是感觉不对。

1 个答案:

答案 0 :(得分:1)

与ListView不同,无法直接通过RecyclerView适配器添加或删除项目。您需要直接更改数据源并通知适配器任何更改。在向适配器通知不同更改时,可以使用许多方法:

  • notifyItemChanged(int pos):通知该位置的项目已更改。
  • notifyItemInserted(int pos):通知新插入的位置反映的项目。
  • notifyItemRemoved(int pos):通知先前位于该位置的项目已从数据集中删除。
  • notifyDataSetChanged():通知数据集已更改。仅作为最后的手段使用。

每次我们想要在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());