RecyclerView:在布局后更改并应用填充

时间:2019-02-01 10:12:32

标签: android android-layout android-recyclerview

我有一个水平的RecyclerView,并且想更改padding,因为我希望第一个项目在屏幕上居中。 由于项目的大小是可变的,因此我需要计算runtime处的填充。 即像这样:

+--------------------------+
|                          |
|                          |
|                          |
|           Text1  Text2  T|
|                          |
~                          ~
|                          |
|                          |
+--------------------------+

为此,我使用了onLayoutChangeListener:

recyclerView.addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
        override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int,
                                    oldRight: Int, oldBottom: Int) {
            recyclerView.removeOnLayoutChangeListener(this)

            // Use width of first child to calculate
            val childAt = recyclerView.layoutManager?.getChildAt(0)
            childAt?.let {
                val padding = calculateHorizontalPadding(it.width)
                recyclerView.setPadding(padding, recyclerView.paddingTop, padding,
                        recyclerView.paddingBottom)

                recyclerView.invalidate()
                recyclerView.requestLayout()
            }
        }
    })

似乎invalidate()requestLayout()调用无效。 还有其他建议来计算padding动态吗?

2 个答案:

答案 0 :(得分:0)

您可以通过两种方式实现。

首先,您设置您的recyclerview的padding_start。我不确定这是否行得通。 其次,在您的适配器上,检查onBindViewHolder上的项目是否是第一个。如果是这样,请在项目视图上放置一个划桨,然后计算视图的中心。

答案 1 :(得分:0)

您可以找到这样的回收项目的第一项宽度:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        if (position == 0) {
            holder.itemView.post {
                Log.v("__DEBUG", "onBind holder.itemView.width = ${holder.itemView.width}")
                Log.v("__DEBUG", "onBind holder.itemView.left = ${holder.itemView.left}")
            }
        }
}