Java 确定LayoutManager预布局中显示的视图
我想在项目从可见屏幕边界外移动到可见点时支持预测动画 我在Java 确定LayoutManager预布局中显示的视图,java,android,android-layout,android-recyclerview,android-animation,Java,Android,Android Layout,Android Recyclerview,Android Animation,我想在项目从可见屏幕边界外移动到可见点时支持预测动画 我在onLayoutChildren(RecyclerView.Recycler Recycler,RecyclerView.State)中执行的所有填充操作 根据支持预布局阶段预测动画的文档(state.isPreLayout()),我应该设置更改动画的初始条件(例如,将显示视图放置在某处) 问题是我无法在预布局中确定哪些视图将从外部移动,因为我只能在当前连接到RecyclerView视图和OnItemMoved(RecyclerView
onLayoutChildren(RecyclerView.Recycler Recycler,RecyclerView.State)中执行的所有填充操作
根据支持预布局阶段预测动画的文档(state.isPreLayout()
),我应该设置更改动画的初始条件(例如,将显示视图放置在某处)
问题是我无法在预布局中确定哪些视图将从外部移动,因为我只能在当前连接到RecyclerView视图和OnItemMoved(RecyclerView RecyclerView,int from,int to,int itemCount)的情况下操作。
方法在预布局阶段后调用。(例如,在预布局之前称为)
是因为LayoutManager
的错误,还是我有什么办法
在预布局中确定哪些视图将很快移动
PS:我能够维护从可见点到外部的预测动画,因为我能够在可见视图中循环,并使用recycler.convertPreLayoutPositionToPostLayout
确定要移动哪些视图
//childViews is an iterable over RecyclerView items
for (View view : childViews) {
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) view.getLayoutParams();
boolean probablyMovedFromScreen = false;
if (!lp.isItemRemoved()) {
//view won't be removed, but maybe it is moved offscreen
int pos = lp.getViewLayoutPosition();
//start view is a first visible view on screen
int lowestPosition = getPosition(startView);
int highestPosition = getPosition(endView);
pos = recycler.convertPreLayoutPositionToPostLayout(pos);
probablyMovedFromScreen = pos < lowestPosition || pos > highestPosition;
}
if (probablyMovedFromScreen) {
//okay this view is going to be moved
}
}
//ChildView是一个可重复使用的视图项
用于(视图:子视图){
RecyclerView.LayoutParams lp=(RecyclerView.LayoutParams)视图。getLayoutParams();
布尔值probablyMovedFromScreen=false;
如果(!lp.isItemRemoved()){
//视图不会被删除,但可能已移到屏幕外
int pos=lp.getViewLayoutPosition();
//开始视图是屏幕上第一个可见的视图
int lowestPosition=getPosition(开始视图);
int highestPosition=getPosition(endView);
pos=回收商。转换器预布局输出位置到布局输出(pos);
probablyMovedFromScreen=位置<最低位置| |位置>最高位置;
}
如果(可能从屏幕上观看){
//好的,这个视图将被移动
}
}
这对我帮助很大,但它也没有描述我需要的动画
PPS:LinearLayoutManager也不支持此类动画。(只有简单的淡入动画)您不知道哪些项目将可见,但您知道哪些项目将消失(或更改),因此基于此,您可以估计在哪个方向上需要多少空间。您可以检查LinearLayoutManager的代码以了解其工作原理。 您还可以阅读这些关于RecyclerView系统详细信息的文章
但是关于运动,问题是关于运动。例如,屏幕上显示从100到120的视图,0视图将移动到110位置。因此,要播放预测动画,我应该将0视图放在某个位置,但我不知道它到底是0视图,因为
onismoved
仍然没有在预布局中调用。如果不这样做,这样的视图将以简单的淡入动画显示,LinearLayoutManager
也不能解决这个问题,因为我看到我已经奖励你不要烧掉它,但答案仍然是开放的。不管怎样,泰还在努力寻找解决方案……这是个好问题。我也被困在这里了。如果你能找到解决方案,请分享。