0

我正在使用数据绑定来设置一个RecyclerView. 这是绑定适配器:

fun setRecyclerDevices(recyclerView: RecyclerView, items: List<Device>, itemBinder: MultipleTypeItemBinder,
                                   listener: BindableListAdapter.OnClickListener<Device>?) {

        var adapter = recyclerView.adapter as? DevicesBindableAdapter
        if (adapter == null) {
            val spannedGridLayoutManager = SpannedGridLayoutManager(orientation = SpannedGridLayoutManager.Orientation.VERTICAL,
                    spans = getSpanSizeFromScreenWidth(recyclerView.context, recyclerView))
            recyclerView.layoutManager = spannedGridLayoutManager
            recyclerView.addItemDecoration(SpaceItemDecorator(left = 15, top = 15, right = 15, bottom = 15))
            adapter = DevicesBindableAdapter(items, itemBinder)
            adapter.setOnClickListener(listener)
            recyclerView.adapter = adapter
        } else {
            adapter.setOnClickListener(listener)
            adapter.setItemBinder(itemBinder)
            adapter.setItems(items)
        }
    }

getSpanSizeFromScreenWidth需要回收站的宽度来做一些计算。但它总是返回0

我试图应用ViewTreeObserver这样的:

recyclerView.viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {

                override fun onGlobalLayout() {
                    recyclerView.viewTreeObserver.removeOnGlobalLayoutListener(this)
                    val spannedGridLayoutManager = SpannedGridLayoutManager(orientation = SpannedGridLayoutManager.Orientation.VERTICAL,
                            spans = getSpanSizeFromScreenWidth(recyclerView.context, recyclerView))
                    recyclerView.layoutManager = spannedGridLayoutManager
                }
            })

或者post像这样使用:

recyclerView.post({
                val spannedGridLayoutManager = SpannedGridLayoutManager(orientation = SpannedGridLayoutManager.Orientation.VERTICAL,
                        spans = getSpanSizeFromScreenWidth(recyclerView.context, recyclerView))
                recyclerView.layoutManager = spannedGridLayoutManager
            })

getSpanSizeFormScreenWidth 的代码:

private fun getSpanSizeFromScreenWidth(context: Context, recyclerView: RecyclerView): Int {
        val availableWidth = recyclerView.width.toFloat()
        val px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300f, context.resources.displayMetrics)
        val margin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 15f, context.resources.displayMetrics)
        return Math.max(1, Math.floor((availableWidth / (px + margin)).toDouble()).toInt()) * DevicesBindableAdapter.WIDTH_UNIT_VALUE
    }

0但尽管我RecyclerView显示在屏幕上(不是0),它仍然会返回。

有任何想法吗?

4

1 回答 1

0

在检查代码时,看起来你RecyclerView实际上可能很好,但你的逻辑getSpanSizeFromScreenWidth可能不是。

它看起来像这样:当小于时Math.floor((availableWidth / (px + margin)).toDouble()).toInt()始终为 0 。这将导致返回。availableWidth(px + margin)getSpanSizeFromScreenWidth0


分解它:

  • Math.floor- 将 adouble 向下舍入为整数
  • availableWidth / (px + margin)- 将是一个数字(的一小部分availableWidth

因此,您0有时会特别是在较小的屏幕和/或较小密度的屏幕上。

那有意义吗?可能不是这个问题,但我会从那里开始。在不了解整个上下文的情况下很难准确地告诉您问题,但这很可能是您的问题。


如果这不是你的问题,你能说一下你的价值是什么availableWidth,在执行px期间margin

于 2017-11-07T08:21:05.227 回答