2015-11-23 28 views
12

我已经为RecyclerView写了两个ItemDecorator。每个在getItemOffsets()增加一些顶部偏移量。比方说:如何在RecyclerView中获得偏移量ItemDecorator

  • 第一装饰增添20dp顶偏
  • 二decrator增加30DP顶偏

现在,当我他们都加入到RecyclerView,每个项目都正确地50dp抵消,这是好。

但是问题出在这里: 如何在onDraw/onDrawOver中得到这个偏移量?

通常修饰者通过遍历parent.getChildAt(i)东西来绘制自己的东西,并获得child.getTop()例如绘制RecyclerView的子视图。

但是在这种情况下,这样做会混淆其他装饰器的绘制,因为它也会使用child.getTop()

所以目前看起来好像两个装饰者都需要了解对方和对方的身高。

我在这里错过了什么吗?我希望我是。

编辑:我向Android问题跟踪器报告了一个问题,似乎这将工作。明星它跟踪的进展:https://code.google.com/p/android/issues/detail?id=195746

回答

12

tl; dr不,你没有失去任何东西。但你可以得到getItemOffsets所需的值,虽然对我来说似乎有点肮脏。

基本上没有变得比自己管理装饰等装饰的高度只有一个选项:LayoutManager.getDecoratedTop();

的onDraw

onDraw你得到recyclerView的整个画布,c.getClipBounds()不成立任何信息。尽管添加装饰的javadoc表示装饰应该以的范围绘制。

此外,得到parent.getLayoutManager().getDecoratedTop()会给你在每个装饰相同的值,因为它已经太晚了,这些值是为了布局的目的。

我们太晚了,布局已经完成,我们错过了。

getItemOffsets

请注意,我测试了LinearLayoutManager下,它可能也无法与其他人(不与大多数自定义的最绝的)工作。由于我依靠测量那些未记录的调用之间的事件,因此给定的解决方案可能会与未来版本冲突。

我只是觉得我需要这个免责声明。我发现了一个工作的解决方案(看mOffset):

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    mOffset = parent.getLayoutManager().getTopDecorationHeight(view); 
    outRect.set(0, 10, 0, 0); 
} 

这工作,因为recyclerview,计算孩子的总插图时,是updating the views package local LayoutParams variable。虽然我们不能自己访问布局参数变量,但调用getTopDecorationHeight实际上使用(当前)脏的插入,给我们适当的值。
因此,您可以在应用自己的装饰之前获得以前装饰的偏移!

应用它,只是提请你装修时要取出其他装饰偏移:

c.drawRect(child.getLeft() + child.getTranslationX(), 
     mOffset + layoutManager.getDecoratedTop(child) + child.getTranslationY(), 
     child.getRight() + child.getTranslationX(), 
     child.getBottom() + child.getTranslationY(), paint); 

这将实际应用的其他装饰偏移,然后从正确顶部绘制自己。

若干问题

这是目前对于默认的一个基本的,工作液用例但是。如果您有不同的偏移量,取决于项目VIEW_TYPE或适配器位置,则会变得棘手。

您将重复您的逻辑并为各种视图类型保留各种偏移量,或者您必须存储/检索每个视图或视图类型的偏移量。

要做到这一点,您可以添加一个自定义标签view.setTag(key, object)或做一些类似的东西,类似于传递的RecyclerView.State对象。

+0

谢谢你的详细解答!目前这样做,但我必须补充说,目前的情况不是很好。我需要找点时间在Android问题跟踪器中为此提出问题。 – dimsuz

+1

@dimsuz我对目前的解决方案感觉非常好,并认为它可能有效。如果您提出问题,请提供链接!谢谢:) –

+1

报告:https://code.google.com/p/android/issues/detail?id=195746 – dimsuz

相关问题