2016-02-11 12 views
7

遅延(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(); 
    } 
} 

答えて

1

私はかなり類似したケースがあったので、私はあなたが次の操作を行い勧め:

1- CountdownTimerとあなたchatListItemためのCustomViewを作成します。

2カスタムビュークラス内のstartTimer()メソッドを使用してタイマーを開始し、終了時にアイテムを破棄します。

3-このrecyler animation libraryを使用すると、ItemRemovedでアイテムをアニメートできます。

+0

「LinearLayout」(ビューを再利用せずに)のようなカスタムビューを使用することは正しいです。おそらくこの問題は消えてしまうでしょう。しかし、パフォーマンスは良くありません。私はこのライブラリを使用しています。 – Michael

+0

Thx Boukharist。私は遅延のハンドラを使用しているだけでアイテムとフェードアウトのアニメーションを削除します。しかし、それを削除した後には、フェードアウト処理がまだ完了していないため、リサイクルビューのすべての項目が上がっているため、最初の要素が削除されているため、メッセージが2つに蓄積されているように見えます。 (私は常に最初の要素を削除しています - 古い)。どのようにアイデアを削除する前にアニメーションを開始する? – Michael

+0

あなたのコードを表示できますか?あなたがリスナーでアニメーションを使用している場合には、リサイクラ・アダプタに通知する必要があると思います.AnimationFinished() – Boukharist

関連する問題