簡體   English   中英

在 RecyclerView.Adapter 中覆蓋 notifyItemChanged 的​​動畫

[英]Override animation for notifyItemChanged in RecyclerView.Adapter

好吧,我有一個帶適配器的 RecyclerView,一切都很好。 ArrayList 數據集中的項目會定期更新。 因此,項目及其元素以及它們在列表中的位置都會發生變化。 這是通過簡單的排序和手動調用這些方法來實現的,無論何時發生:

// swapping two items
Collections.swap(items, i, j);
itemsAdapter.notifyItemMoved(i, j);

// adding a new one
itemAdapter.notifyItemInserted(items.size());

// when updating valus
itemAdapter.notifyItemChanged(i);

后者,是我痛苦的原因。 每次更新項目時,都會觸發一點“閃爍”動畫。

我為此找到了幾個解決方案:

// disabling all animations
recyclerView.getItemAnimator().setSupportsChangeAnimations(false);

// or

// setting the animation duration to zero,
recyclerView.getItemAnimator().setChangeDuration(0);

但是當項目移動(被交換)時,這兩個都會殺死動畫。 我只想覆蓋一個動畫並保留所有這些魔法。 有沒有辦法做到這一點? 如果它覆蓋了 ItemAnimator,有沒有人有一個簡單的例子?

提前致謝!

有一種專門的方法可以禁用僅更改項目的動畫:

((SimpleItemAnimator) myRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

官方文檔

是的,我做到了。

首先,獲取 DefaultItemAnimator 的源代碼。 獲取代碼並在您的項目中創建一個名為 MyItemAnimator 的類。 然后,將 ItemAnimator 設置為修改后的 MyItemAnimator 的新實例,如下所示:

recyclerView.setItemAnimator(new MyItemAnimator());

現在,進入新類源代碼並找到該方法

animateChangeImpl(final ChangeInfo changeInfo) { ... }

我們只需要定位改變 alpha 值的方法調用。 找到以下兩行並刪除 .alpha(0) 和 .alpha(1)

oldViewAnim.alpha(0).setListener(new VpaListenerAdapter() { ... }
newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).alpha(1).setListener(new VpaListenerAdapter() { ... }

像這樣

oldViewAnim.setListener(new VpaListenerAdapter() { ... }
newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).setListener(new VpaListenerAdapter() { ... }

嘗試設置:

mRecyclerview.setItemAnimator(null);

@Pablo A. Martínez 的Kotlin版本回答:

(recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false

如果你只是修改 Recyclerview 的數據意味着沒有添加或刪除項目,那么你應該添加這一行。

mRecyclerview.setHasFixedSize(true); 

這樣recyclerview就會知道在您可以申請之后尺寸沒有變化

((SimpleItemAnimator) mRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false);

這樣動畫就會消失,代碼就會像魅力一樣工作:)

亞歷克斯的回答略有不同。

我沒有完全刪除 alpha 更改,而是減少了它。 唯一需要改變的是:

        //changed alpha from 0
        ViewCompat.setAlpha(newHolder.itemView, 0.5f);

        //changed alpha from 0
        oldViewAnim.alpha(0.5f).setListener(new VpaListenerAdapter() {

在這兩種情況下,將 0 更改為 0.5 這具有消除與 alpha 相關的閃爍完全為 0 的效果,但保持項目更改動畫的變形質量。

在我的例子中,recyclerview 占據了工具欄下方的所有空間。 我所做的只是將 recyclerview 的 layout_height 從 wrap_content 更改為 match_parent 並且閃爍消失了。

暫無
暫無

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

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