2016-04-30 45 views
17

私は時間を使ってフィールドを私のRecyclerViewに変更しようとしています。各個人ViewHolderにはCardViewが含まれ、さらにいくつかのビューが内部にあります。アニメーション化したい唯一のビューは時間のあるビューです。RecyclerView.ViewHolderの一部更新

adapter.notifyDataSetChanged(); 

RecyclerView with no animations

更新アイテムは一つ一つが、その後、全体CardViewが点滅するので助けにはならない:

int len = adapter.getItemCount(); 
for(int i=0;i<len;i++) { 
    adapter.notifyItemChanged(i); 
} 

enter image description here

あなたが見ることができるように、何のアニメーションはありませんすべてViewHoldersのリストを取得して、その1つだけを更新(アニメーション化)する方法はありますか?それぞれの中に?

+1

アイテムアニメーターを追加する必要があります –

答えて

35

RecyclerView.Adapterのオブザーバーに、Objectのペイロードを渡してRecyclerView.ViewHoldersの部分的なアップデートを発行するように通知することができます。​​があるか、相対的または絶対的な時間を示すフラグを含むことができる

notifyItemRangeChanged(positionStart, itemCount, payload); 

。​​をビューホルダーにバインドするには、アダプターの次のonBindViewHolder(viewHolder, position, payloads)メソッドをオーバーライドし、データのpayloadsパラメーターをチェックします。あなたのMyViewHolder.bindTimePayload(payload)メソッド内

@Override 
public void onBindViewHolder(MyViewHolder viewHolder, int position, List<Object> payloads) { 
    if (payloads.isEmpty()) { 
     // Perform a full update 
     onBindViewHolder(viewHolder, position); 
    } else { 
     // Perform a partial update 
     for (Object payload : payloads) { 
      if (payload instanceof TimeFormatPayload) { 
       viewHolder.bindTimePayload((TimeFormatPayload) payload); 
      } 
     } 
    } 
} 

、​​に指定された時間形式に時間TextViewsを更新します。

+1

美しく動作します。どうもありがとうございました。 – PhpXp

+0

あなたは魅力のように働いて、私はリサイクラービューをviewpagerに変更しようとしていました。しかし、あなたはまた私に多くの時間を惜しみなく救っただけでなく、 –

関連する問題