RecyclerView
的自定义布局管理器。我在我的管理器构造函数中通过setAutoMeasureEnabled(true)
启用了自动测量功能。当
RecyclerView
的layout_height
属性设置为wrap_content
时,这个LayoutManager
可以根据其中的项测量出RecyclerView
的高度。它运行得很完美,但当我删除底部的最后一项时,删除动画正在播放,它导致RecyclerView
在动画完成之前就已经测量出了其高度。请看这个gif图。
![enter image description here](https://istack.dev59.com/rx1Zd.gif)
如你所料,对于添加项,这种行为是正确的,因为在这种情况下需要在动画之前测量容器的大小。
我该如何处理这种情况,使得
RecyclerView
在动画结束后自动测量呢?我在onLayoutChildren
中有所有子项位置逻辑,但我认为这不需要在此问题上进行解释,可能会很宽泛和不清楚。或许我应该手动处理LayoutManager
的onMeasure
拦截器(当删除项时调用4次(在onItemsRemoved调用之前调用一次)),这样我就可以根据在删除开始时接收到的高度设置测量高度了。@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
super.onMeasure(recycler, state, widthSpec, heightSpec);
requestSimpleAnimationsInNextLayout();
if (!isAutoMeasureEnabled()) {
setMeasuredDimension(getWidth(), preHeight);
}
}
@Override
public void onItemsRemoved(RecyclerView recyclerView, int positionStart, int itemCount) {
super.onItemsRemoved(recyclerView, positionStart, itemCount);
setAutoMeasureEnabled(false);
new Handler(Looper.myLooper()).postDelayed(new Runnable() {
@Override
public void run() {
setAutoMeasureEnabled(true);
requestSimpleAnimationsInNextLayout();
requestLayout();
}
}, 400);
preHeight = //calculate height before deletion
}
如您所见,我提供了一个处理程序,其中包含约延迟400毫秒
的值,该处理程序在动画完成后执行自动测量,因此这可能导致需要的结果,但动画的持续时间不是固定的,而且我没有看到任何可能监听动画完成事件的可能性。
所以,期望的行为是:
顺便说一下,LinearLayoutManager的自动测量方式也是相同的。
如果您可以通过文本描述算法指引我走向正确的方向,那就足够了。