Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定LayoutManager预布局中显示的视图_Java_Android_Android Layout_Android Recyclerview_Android Animation - Fatal编程技术网

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
也不能解决这个问题,因为我看到我已经奖励你不要烧掉它,但答案仍然是开放的。不管怎样,泰还在努力寻找解决方案……这是个好问题。我也被困在这里了。如果你能找到解决方案,请分享。