tl;dr调用scrollToPosition((后,如何等待真正的滚动完成?我所说的真正滚动是指(1(RecyclerView
已经完成滚动,(2(它已经为滚动的设置位置绑定了所有ViewHolder
s。
描述:
我正在尝试修复一些循环器视图的过渡动画,我很难实现它。
该应用程序与其中一个活动中的RecyclerView
和用户单击RecyclerView
中的项目时充当"详细信息视图"的ViewPager
一致。
从RecyclerView
到ViewPager
的正向导航工作得很好,但问题是,反向导航不起作用。请注意,用户可以在详细信息视图中使用ViewPager
进行导航,当他们使用RecyclerView
重新进入活动时,项目的位置可能与原始情况不同,这意味着RecyclerView
需要首先搜索到项目,然后恢复过渡动画。
我无法工作的原因是,我在之前恢复了动画RecyclerView
已经正确地搜索和绑定了底层ViewHolder
,但我不知道如何等待滚动真正完成,然后恢复共享元素转换。
我在代码中(在Reenter
代码上(做的是:
if (isReentering) {
// postpone the animation here
ActivityCompat.postponeEnterTransition(getActivity());
scollIndex = ... // determine the correct item position
layoutManager.scrollToPosition(scrollIndex);
final RecyclerView recyclerView = getRecyclerView();
new Handler().post(new Runnable() {
@Override
public void run() {
recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
recyclerView.requestLayout();
ActivityCompat.startPostponedEnterTransition(getActivity());
return true;
}
});
}
});
}
我还在Adapter
中设置了这样的转换名称:
@Override
public void onBindViewHolder(TViewHolder holder, int position) {
....
holder.setTransitionName(_data.get(position).getContentId().toString());
}
转换名称是在基础View
中设置的项的UUID。CCD_ 16和CCD_。
scrollIndex
是正确的,RecyclerView
确实滚动到了它,但问题是:滚动和绑定只有在我已经在代码中开始了延迟的回车转换(通过调用ActivityCompat.startPostponedEnterTransition(getActivity());
(后才生效,这会导致奇怪的转换动画。
我想做的是,在调用startPostponedEnterTransition
之前,以某种方式等待滚动和ViewHolder
绑定完成,所以我的问题是,我如何才能知道滚动何时完成,所有ViewHolder
都已绑定,这样我才能调用它?
非常感谢,
您可以使用此答案中的代码来检查ViewHolders是否已绑定。