回收者查看项目装饰和视图立面图

时间:2019-06-10 10:45:31

标签: android android-recyclerview android-cardview android-elevation

我使用回收站视图装饰来在特定项目之前增加边距。

我的物品-主要是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)
        }
    }
}

它看起来像:

exemple

仅供参考:我不想管理商品的利润,因为回收者视图的顺序是动态的

任何想法如何解决? ???

1 个答案:

答案 0 :(得分:0)

您正在使用ItemDecorations来完成他们原本不打算做的事情,但是您不想使用正确的事情,现在想破解一个解决方案? (我说得对吗?)

为了解决这个难题,我会给你我的0.02c:

  1. ItemDecorations并非旨在执行您希望它们执行的操作,因此为什么会看到这些副作用。
  2. ItemDecorations是RecyclerView的一种方式,它使您有机会“装饰”一个视图,方法是使用画布和几毫秒的时间在屏幕上绘制某些东西,而这完全脱离了View / Layout / Measure引擎。
  3. 由于“动态顺序”,您特别禁止使用项目边距(和填充?)。我不完全确定与此相关的命令,但是我不能在那方面与你战斗;什么顺序?项目订单?顺序与边距或间距有什么关系? (我确定是有原因的,您没有列出原因)。 订单将如何影响这一点?由于项目不同,边距/间距在两侧是否不均匀?我推断是因为您在if (item == type_xxx) {}中提供了一个小提示,所以我假设您正在使用某种itemType在回收者视图中呈现不同的视图,现在您想为这些项目添加一些动态边距,根据他们的邻居。

我假设所有这一切。

答案:您无法从ItemDecorator绘制视图的边界,因为它非常酷,传递给它的Canvas(因此它可以绘制)已经被Android测量/布局引擎计算和约束了。

也:

android:clipChildren="false"
android:clipToPadding="false"

有副作用(从性能角度来看,这一点都不好)。

除了性能,您根本无法(或更确切地说,不应!)尝试以这种方式进行操作。装饰不是要“免费随地抽奖”卡。 我建议您在项目视图和/或recyclerview中提供适当的填充/边距。当通过资源(例如dimens.xml)提供资源时,它们可以处理密度像素,并考虑构建变体和风味。

这些技术都不对商品装饰者可用。但是,如果您还忽略了代码分离,单一职责原则,控制反转以及所有这些行话,那么您仍然将无法执行该操作,因为画布是为您预先计算的,因此您梦dream以求的是在画布上的任何地方绘图屏幕。

(好的,您可以在任何地方绘制,但这不会推挤其他视图,您只是在内容的顶部绘制而不触摸它)。