簡體   English   中英

RecyclerView:如何確定scrollToPosition()何時完成ViewHolders的綁定

[英]RecyclerView: How to determine when scrollToPosition() has finished binding the ViewHolders

tl; dr如何在調用scrollToPosition()之后等到真正的滾動? 真正滾動的意思是(1) RecyclerView已完成滾動,(2)它已將所有ViewHolder綁定到滾動的設置位置。

描述:

我正在嘗試為回收者視圖修復一些過渡動畫,我很難實現它。

該應用程序與其中一個活動中的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());
}

轉換名稱是項目的UUID,在基礎View設置。 ViewPagerRecyclerView正確設置了它。

scrollIndex是正確的, RecyclerView會滾動到它,但這里是catch:滾動和綁定僅我已經在我的代碼中啟動推遲的enter轉換后才生效(通過調用ActivityCompat.startPostponedEnterTransition(getActivity()); )導致奇怪的過渡動畫。

我想要發生的是以某種方式等到滾動和ViewHolder綁定完成后再調用startPostponedEnterTransition所以我的問題是,如何找出滾動何時完成並且所有ViewHolder都被綁定以便我可以調用它?

提前謝謝了,

如果ViewHolders已綁定,您可以使用此答案中的代碼進行檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM