2016-04-30 83 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的清单,然后更新(动画)只有一个TextView每一个里面?

+1

您需要添加项目动画师 –

回答

35

您可以通知您的RecyclerView.Adapter的观察员通过传递有效载荷Object来发布RecyclerView.ViewHolders的部分更新。

notifyItemRangeChanged(positionStart, itemCount, payload); 

凡​​可能是或包含代表相对或绝对时间的标志。要将​​绑定到视图持有者,请在适配器中覆盖以下onBindViewHolder(viewHolder, position, payloads)方法,并检查payloads参数中的数据。

@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); 
      } 
     } 
    } 
} 

在您MyViewHolder.bindTimePayload(payload)方法,更新时间TextViews在​​指定的时间格式。

+1

精美的作品。非常感谢你。 – PhpXp

+0

哥哥你救了我一天,工作就像一个魅力,我正要改变回收视图viewpager。但你的回答也让我学会了,也挽救了我许多时间的辛勤工作 –