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



tl;dr调用scrollToPosition((后,如何等待真正的滚动完成?我所说的真正滚动是指(1(RecyclerView已经完成滚动,(2(它已经为滚动的设置位置绑定了所有ViewHolders。

描述:

我正在尝试修复一些循环器视图的过渡动画,我很难实现它。

该应用程序与其中一个活动中的RecyclerView和用户单击RecyclerView中的项目时充当"详细信息视图"的ViewPager一致。

RecyclerViewViewPager的正向导航工作得很好,但问题是,反向导航不起作用。请注意,用户可以在详细信息视图中使用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是否已绑定。

最新更新