![](/img/trans.png)
[英]RecyclerView creating and binding all ViewHolders when scrolling
[英]RecyclerView: How to determine when scrollToPosition() has finished binding the ViewHolders
tl; dr如何在調用scrollToPosition()之后等到真正的滾動? 真正滾動的意思是(1) RecyclerView
已完成滾動,(2)它已將所有ViewHolder
綁定到滾動的設置位置。
描述:
我正在嘗試為回收者視圖修復一些過渡動畫,我很難實現它。
該應用程序與其中一個活動中的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());
}
轉換名稱是項目的UUID,在基礎View
設置。 ViewPager
和RecyclerView
正確設置了它。
scrollIndex
是正確的, RecyclerView
會滾動到它,但這里是catch:滾動和綁定僅在我已經在我的代碼中啟動推遲的enter轉換后才生效(通過調用ActivityCompat.startPostponedEnterTransition(getActivity());
)導致奇怪的過渡動畫。
我想要發生的是以某種方式等到滾動和ViewHolder
綁定完成后再調用startPostponedEnterTransition
所以我的問題是,如何找出滾動何時完成並且所有ViewHolder
都被綁定以便我可以調用它?
提前謝謝了,
如果ViewHolders已綁定,您可以使用此答案中的代碼進行檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.