RecyclerView:如何确定scrollToPosition()何时完成ViewHolders的绑定

时间:2015-07-06 20:27:30

标签: android

tl; dr 如何在调用scrollToPosition()之后等到真正的滚动?真正滚动的意思是(1)RecyclerView已经完成了滚动,(2)它已经为滚动的设置位置绑定了所有ViewHolder s。

说明:

我正在尝试为回收者视图修复一些过渡动画,并且我很难实现它。

该应用与其中一项活动中的RecyclerView一致,另一项ViewPager充当"详细视图"当用户点击RecyclerView

中的项目时

RecyclerViewViewPager的向前导航功能完全正常,但问题是,向后导航无法正常工作。请注意,用户可以使用详情视图中的ViewPager进行导航,当他们使用RecyclerView重新输入活动时,该项目的位置可能与原始案例不同,这意味着{{ 1}}需要首先scol到项目,然后恢复过渡动画。

我无法让它发挥作用的原因是因为我在之前恢复了动画 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

转换名称是项目的UUID,在基础@Override public void onBindViewHolder(TViewHolder holder, int position) { .... holder.setTransitionName(_data.get(position).getContentId().toString()); } 中设置。 ViewViewPager都设置正确。

RecyclerView是正确的,scrollIndex会滚动到它,但这里有一个问题:滚动和绑定仅在之后生效 I'我已经在我的代码中启动了推迟的输入转换(通过调用RecyclerView),这会导致奇怪的过渡动画。

我想要发生的事情是以某种方式等到滚动和ActivityCompat.startPostponedEnterTransition(getActivity());绑定完成然后再调用ViewHolder所以我的问题是,我怎么能找到当滚动结束并且所有startPostponedEnterTransition被绑定以便我可以调用它时?

非常感谢,

1 个答案:

答案 0 :(得分:-1)

您可以使用this answer中的代码检查ViewHolders是否已绑定。