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