2015-12-20 129 views
0

我动态地呈现(而不是下载)显示在RecyclerView中的项目的缩略图。渲染应该以该项目的大小渲染这些缩略图(所以没有放大或缩小)。确定RecyclerView中视图的大小

我已经试过在ImageView的调用措施()我RecyclerView .Adapter子类的onBindViewHolderonViewAttachedToWindow并在这两种情况下,测量大小(实际尺寸)报告为0。

所以,麻烦简单地说,我无法弄清楚如何知道用什么尺寸来渲染缩略图。

我现在最好的猜测是附加一个侦听器到getViewTreeObserver().addOnGlobalLayoutListener()并在回调中呈现缩略图,但看起来很尴尬。这真的是唯一的方法吗?

我找不到GridLayoutManagerRecyclerView中的任何方法,只是问“这个孩子的观点有多大?”

感谢,

回答

3

是的,因为最有可能的观点没有被测量,并奠定了在目前的onBindViewHolder测量尺寸是零。

我看到它的方式有两种选择。

选项1:蛮力的种类。我假设你有一个垂直滚动的网格布局。你得到RecyclerView的宽度,你得到列的数量,除以另一个,然后得到你的图像宽度。从那里你可以找出身高。现在,如果您正在制作空白边距,多列跨度或其他奇特的东西,则可能需要直接跳到下一个选项。

选项2:优雅复杂。您将需要作出特别ImageView子类,它会做两两件事:

  • 接收基准,以异步任务要呈现的图像。
  • 重写onMeasure()来执行一些特殊的逻辑。当调用onMeasure()时,宽度将是已知的,并且高度将是“任何你想要的大小”。在致电super.onMeasure()之前,您将根据图像的高宽比将heightMeasureSpec更改为精确的高度。然后你打电话super.onMeasure(),然后启动你的渲染任务。渲染任务将引用您的ImageView对象,以便可以在任务完成时加载图像。

您创建onBindViewHolder渲染任务(在那里你会知道你想要的图片),并将其分配给ImageView。在从onMeasure()执行任务时,您还将知道图像所需的大小。

这个解决方案 - 虽然很灵活 - 显然有更多的移动部件,还有更多的方法可能出错。

后你看看这些,你会意识到有实际上是第三个选择:

选项3只呈现在预定大小的图像,让ImageView规模吧。由缩放引入的任何图像失真可能不足以保证在视图的精确维度上渲染努力水平。

+0

选项1是良好结果和非Herculean努力的最佳交集。感谢您经过深思熟虑的建议。 – TomorrowPlusX