我有一个水平的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
动态吗?
答案 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}")
}
}
}