我使用回收站视图装饰来在特定项目之前增加边距。
我的物品-主要是MaterialCardView-具有重要的高度:16dp(感谢我们的UI专家...)
允许使用
在项目视图容器外部绘制高程android:clipChildren="false"
android:clipToPadding="false"
我的问题是:回收商视图装饰会截断高程。
此处是装饰代码:
class TopSpacingItemDecoration(context: Context) : RecyclerView.ItemDecoration() {
private val spacing = context.resources.getDimension(R.dimen.margin_before_section)
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
val position = parent.getChildAdapterPosition(view)
val type = adapter.getItemViewType(position)
if (type == adapter.SPECIFIC_TYPE || other conditions) {
outRect.set(0, spacing.toInt(), 0, 0)
}
}
}
它看起来像:
仅供参考:我不想管理商品的利润,因为回收者视图的顺序是动态的
任何想法如何解决? ???
答案 0 :(得分:0)
您正在使用ItemDecorations来完成他们原本不打算做的事情,但是您不想使用正确的事情,现在想破解一个解决方案? (我说得对吗?)
为了解决这个难题,我会给你我的0.02c:
if (item == type_xxx) {}
中提供了一个小提示,所以我假设您正在使用某种itemType在回收者视图中呈现不同的视图,现在您想为这些项目添加一些动态边距,根据他们的邻居。 我假设所有这一切。
答案:您无法从ItemDecorator绘制视图的边界,因为它非常酷,传递给它的Canvas(因此它可以绘制)已经被Android测量/布局引擎计算和约束了。
也:
android:clipChildren="false"
android:clipToPadding="false"
有副作用(从性能角度来看,这一点都不好)。
除了性能,您根本无法(或更确切地说,不应!)尝试以这种方式进行操作。装饰不是要“免费随地抽奖”卡。 我建议您在项目视图和/或recyclerview中提供适当的填充/边距。当通过资源(例如dimens.xml)提供资源时,它们可以处理密度像素,并考虑构建变体和风味。
这些技术都不对商品装饰者可用。但是,如果您还忽略了代码分离,单一职责原则,控制反转以及所有这些行话,那么您仍然将无法执行该操作,因为画布是为您预先计算的,因此您梦dream以求的是在画布上的任何地方绘图屏幕。
(好的,您可以在任何地方绘制,但这不会推挤其他视图,您只是在内容的顶部绘制而不触摸它)。