Android RecycleView列表项未出现

Android RecycleView列表项未出现,android,android-recyclerview,kotlin,anko,Android,Android Recyclerview,Kotlin,Anko,我一直在尝试让RecyclerView在我的应用程序中工作,其中列表项是ImageViews,图像被下载并(异步)放入onBindViewHolder方法中。我的代码中没有任何错误,但出于某种原因 仅列出用户可见(甚至部分可见)的项目 加载活动时,将图像加载到其中 虽然我看不到这些图片,但我观察到这些项目的高度和宽度分配正确。由于首先下载图像,然后确定ImageView的尺寸,我想问题与RecyclerView本身有关?如果有人能解释一下,那就太好了。谢谢 我还想补充一点,如果活动暂停然后继续(

我一直在尝试让
RecyclerView
在我的应用程序中工作,其中列表项是
ImageView
s,图像被下载并(异步)放入
onBindViewHolder
方法中。我的代码中没有任何错误,但出于某种原因

仅列出用户可见(甚至部分可见)的项目 加载活动时,将图像加载到其中

虽然我看不到这些图片,但我观察到这些项目的高度和宽度分配正确。由于首先下载图像,然后确定
ImageView
的尺寸,我想问题与
RecyclerView
本身有关?如果有人能解释一下,那就太好了。谢谢

我还想补充一点,如果活动暂停然后继续(通过单击“方形”导航按钮然后继续),所有列表项的图像都会正确加载

图1 图2

这是我的密码:

onCreate
方法:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        recyclerView {
            id = ViewID.ID_LIST
        }

        val imgList = ArrayList<ImageView>()
        imgList.add(ImageView(ctx))
        imgList.add(ImageView(ctx))
        imgList.add(ImageView(ctx))
        imgList.add(ImageView(ctx))
        val lv = findViewById(ViewID.ID_LIST) as RecyclerView
        lv.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        lv.adapter = ImageRecyclerAdapter(ctx, imgList)

}

在我将数据绑定到一个同步请求中,并将
ImageView
操作(更改
LayoutParams
)移动到适配器的
onviewatchedtowindow
覆盖方法中之后,它就工作了

onViewAttachedToWindow

override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder?) {
    super.onViewAttachedToWindow(holder)
    val t = holder?.itemView as ImageView
    val dm = Point()
    context.windowManager.defaultDisplay.getRealSize(dm)
    val w = t.maxWidth
    val h = t.maxHeight
    val params = t.layoutParams
    if (params != null) {
        params.width = dm.x
        params.height = (dm.x * (h.toDouble() / w.toDouble())).toInt()
        t.layoutParams = params
        t.requestLayout()
    }
}
onBindViewHolder

override fun onBindViewHolder(p: RecyclerView.ViewHolder, position: Int) {
    val v = p.itemView as ImageView
    Ion.with(v)
            .load(imageList[position].toString())
            .tryGet()
}

在我将数据绑定到一个同步请求中,并将
ImageView
操作(更改
LayoutParams
)移动到适配器的
onviewatchedtowindow
覆盖方法中之后,它就工作了

onViewAttachedToWindow

override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder?) {
    super.onViewAttachedToWindow(holder)
    val t = holder?.itemView as ImageView
    val dm = Point()
    context.windowManager.defaultDisplay.getRealSize(dm)
    val w = t.maxWidth
    val h = t.maxHeight
    val params = t.layoutParams
    if (params != null) {
        params.width = dm.x
        params.height = (dm.x * (h.toDouble() / w.toDouble())).toInt()
        t.layoutParams = params
        t.requestLayout()
    }
}
onBindViewHolder

override fun onBindViewHolder(p: RecyclerView.ViewHolder, position: Int) {
    val v = p.itemView as ImageView
    Ion.with(v)
            .load(imageList[position].toString())
            .tryGet()
}

你知道吗?这完全是对recyclerView、adapter和ViewHolder背后的逻辑的误解。适配器应该将数据绑定到视图,但您正在尝试将视图放到视图中。RTFM当用户看不见图像时,如何不设置图像是一个问题?事实上,这就是为什么要使用recyclerviews的原因。如果你仍然不需要它,那么你应该使用它listview@SurajRao即使用户可以看到图像,也不会设置图像。例如,请看屏幕截图。@ViktorYakunin我不确定我的错误在哪里,请你再详细说明一下好吗?阅读手册,它有示例。Adapter是将两个不兼容的类相互映射时的模式,因此您应该将数据映射到Adapter的bindView方法中的视图。看起来您的数据是图像的URL,所以您应该向适配器提供URL的arrayList,并且在bindView的适配器中,您应该将图像从URL加载到图像视图,图像视图将位于您的ViewHolder中。您知道吗?这完全是对recyclerView、adapter和ViewHolder背后的逻辑的误解。适配器应该将数据绑定到视图,但您正在尝试将视图放到视图中。RTFM当用户看不见图像时,如何不设置图像是一个问题?事实上,这就是为什么要使用recyclerviews的原因。如果你仍然不需要它,那么你应该使用它listview@SurajRao即使用户可以看到图像,也不会设置图像。例如,请看屏幕截图。@ViktorYakunin我不确定我的错误在哪里,请你再详细说明一下好吗?阅读手册,它有示例。Adapter是将两个不兼容的类相互映射时的模式,因此您应该将数据映射到Adapter的bindView方法中的视图。看起来您的数据是图像的URL,所以您应该向适配器提供URL的arrayList,在bindView的适配器中,您应该将图像从URL加载到ViewHolder中的imageView