我有一个应用程序,在运行时在屏幕上布置控件,它通过调用提供了宽度和WRAP_CONTENT
高度的View的measure
方法来遍历每个控件。
它在视图设置任何数据之前执行此操作,以显示视图的模板版本,然后在实际数据设置在视图上之后再执行一次。
问题是,由于它两次使用相同的输入调用了measure
,因此第二次我们命中了测量缓存,并且即使控件上的数据已更改,它也不会重新测量。
是否有任何方法可以强制它在第二次调用时重新测量?
我有一个应用程序,在运行时在屏幕上布置控件,它通过调用提供了宽度和WRAP_CONTENT
高度的View的measure
方法来遍历每个控件。
它在视图设置任何数据之前执行此操作,以显示视图的模板版本,然后在实际数据设置在视图上之后再执行一次。
问题是,由于它两次使用相同的输入调用了measure
,因此第二次我们命中了测量缓存,并且即使控件上的数据已更改,它也不会重新测量。
是否有任何方法可以强制它在第二次调用时重新测量?
/**
* Forces this view to be laid out during the next layout pass.
* This method does not call requestLayout() or forceLayout()
* on the parent.
*/
public void forceLayout() {
if (mMeasureCache != null) mMeasureCache.clear();
mPrivateFlags |= PFLAG_FORCE_LAYOUT;
mPrivateFlags |= PFLAG_INVALIDATED;
}
我还没有找到清除缓存的方法,但如果其中一个值是UNSPECIFIED,则可以通过类似以下方式强制进行缓存不匹配:
int fakeSpace = (int) (Math.random() * 9999999);
int spec = View.MeasureSpec.makeMeasureSpec(fakeSpace, View.MeasureSpec.UNSPECIFIED);
view.measure(spec, spec);