遅延(20秒)のあるanimatoinでチャットリストを作成したいと思います。この時間が経過すると、各アイテムはアニメーションがフェードアウトして消滅するはずです。遅延を伴うRecyclerViewからのアイテムの削除方法
スクロールせずにRecyclerView
を使用しても問題ありません。 私はアダプタのメソッドをオーバーライドし、すべて正常に動作します。
@Override
public void onViewAttachedToWindow(final ViewHolder holder) {
if(holder.alpha == null) {
holder.alpha = ObjectAnimator.ofFloat(holder.itemView, View.ALPHA, 1f, 0f);
holder.alpha.setDuration(300);
holder.alpha.setStartDelay(20000);
holder.alpha.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
holder.profilePic.setEnabled(false);
holder.messageContainer.setEnabled(false);
if (items.size() > 0) {
items.remove(0);
notifyItemRemoved(0);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
holder.alpha.start();
}
}
@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
if(holder.alpha != null) {
holder.alpha.cancel();
holder.alpha = null;
}
}
私はリサイクラービューで6つのメッセージを表示しています。
スクロールが有効になっているという問題があります。 (有効なスクロールにはonViewDetachedFromWindow
メソッドを使用していません)。ソリューション(上)を使用すると、アニメーションでViewHolder
が再利用されました。各itemView
からViewHolder holder
にアニメーションがあります。受信した7th messegeの場合、このメッセージには再利用されたホルダーからのアニメーションが既にあります。しかし、onViewAttachedToWindow
のアニメーションは同じビューで再び追加されています。
RecyclerView
の各メッセージにアニメーションの解決策が見つかりません。私はLayoutAnimationController
を使って各子供のアニメーションを試してみました。同じ子供のためにLayoutManager
を使ってみました。
テストムービー: https://www.dropbox.com/s/1sxdonpasq6lf0o/IMG_0262.MOV?dl=0
任意のアイデア?
[編集:]
// Hnalder to remove item from RecyclerView
Handler removeItems = new Handler() {
@Override
public void handleMessage(Message msg) {
if(adapter != null && adapter.getItemCount() > 0) {
adapter.removeFirst();
}
}
};
...
//Fragment::initRecyclerView
...
chatView.setLayoutManager(layoutManager);
chatView.setAdapter(adapter);
chatView.setItemAnimator(new ChatItemAnimator());
//ChatAdapter::removeFirst()
public void removeFirst() {
items.removeFirst();
notifyItemRemoved(0);
}
//ChatItemAnimator
public class ChatItemAnimator extends BaseItemAnimator {
@Override
protected void animateRemoveImpl(RecyclerView.ViewHolder holder) {
ViewCompat.animate(holder.itemView)
.alpha(0)
.setDuration(300)
.setListener(new DefaultRemoveVpaListener(holder))
.start();
}
}
「LinearLayout」(ビューを再利用せずに)のようなカスタムビューを使用することは正しいです。おそらくこの問題は消えてしまうでしょう。しかし、パフォーマンスは良くありません。私はこのライブラリを使用しています。 – Michael
Thx Boukharist。私は遅延のハンドラを使用しているだけでアイテムとフェードアウトのアニメーションを削除します。しかし、それを削除した後には、フェードアウト処理がまだ完了していないため、リサイクルビューのすべての項目が上がっているため、最初の要素が削除されているため、メッセージが2つに蓄積されているように見えます。 (私は常に最初の要素を削除しています - 古い)。どのようにアイデアを削除する前にアニメーションを開始する? – Michael
あなたのコードを表示できますか?あなたがリスナーでアニメーションを使用している場合には、リサイクラ・アダプタに通知する必要があると思います.AnimationFinished() – Boukharist