【问题标题】:RecycleView list items not appearingRecyclerView 列表项未出现
【发布时间】:2016-12-24 18:03:03
【问题描述】:

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

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

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

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

图片#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)

}

RecyclerView.Adapter 类:

private class ImageRecyclerAdapter(val context: Context, val imageList: ArrayList<ImageView>) :
            RecyclerView.Adapter<RecyclerView.ViewHolder>() {

        override fun onViewRecycled(holder: RecyclerView.ViewHolder?) {
            super.onViewRecycled(holder)
            if (holder != null) {
                val v = holder.itemView as ImageView
                v.setImageBitmap(null)
            }
        }

        override fun onBindViewHolder(p: RecyclerView.ViewHolder, position: Int) {
            val v = p.itemView as ImageView
            Ion.with(v)
                    .load("https://pbs.twimg.com/profile_images/616076655547682816/6gMRtQyY.jpg")
                    .setCallback({ exception, t ->
                        if (t != null) {
                            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()
                            }
                        }
                    })
        }

        override fun getItemCount(): Int {
            return imageList.size
        }

        override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
            val v = ImageView(context)
            return object : RecyclerView.ViewHolder(v) {}
        }
    }

【问题讨论】:

  • 你知道吗?那是对recyclerView、adapter和ViewHolder背后的逻辑的完全误解。适配器应该将数据绑定到视图,但您正在尝试将视图放入视图。 RTFMdeveloper.android.com/reference/android/support/v7/widget/…
  • 当图像对用户不可见时,如何设置图像是个问题?实际上这就是为什么要使用 recyclerviews..check developer.android.com/training/material/lists-cards.html 。如果您仍然不需要它,那么您应该使用 listview
  • @SurajRao 即使图像对用户可见,也没有设置图像。例如,请参阅屏幕截图。
  • @ViktorYakunin 我不确定我理解我的错误在哪里,你能详细说明一下吗?
  • 阅读手册,里面有例子。当您将两个不兼容的类相互映射时,适配器是模式,因此您应该将数据映射到适配器的 bindView 方法中的视图。看来您的数据是图像的 URL,因此您应该向适配器提供 url 的数组列表,并且在 bindView 的适配器中,您应该将图像从 url 加载到将在您的 ViewHolder 中的 imageView

标签: android android-recyclerview kotlin anko


【解决方案1】:

在我将数据绑定到 Synchronous 请求后它起作用了,并且我将 ImageView 操作(更改 LayoutParams)移动到我的适配器的 onViewAttachedToWindow 覆盖方法中。

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()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2017-01-06
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多