RecyclerView.ViewHolder的部分更新

时间:2016-04-30 15:20:36

标签: android animation android-recyclerview

我正在尝试在RecyclerView中随时间更改字段。每个人ViewHolder都包含CardView和更多内容。我想要制作动画的唯一视图是有时间的视图。如您所见,没有动画:

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内的一个for(var i=0; i<100; i++){ var cell = document.getElementById(i); cell.addEventListener("click", handleClick); console.log("test") } function handleClick(e){ var cell = e.target; console.log(cell); cell.addEventListener("keyup", handleInput); console.log(true); cell.removeEventListener("click", handleClick); console.log(true); } function handleInput(e){ var key = e.keyCode; var i = e.target.id; console.log(key); document.getElementById(i).innerHTML = key; document.getElementById("output").innerHTML = key; }

1 个答案:

答案 0 :(得分:52)

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

notifyItemRangeChanged(positionStart, itemCount, payload);

payload可以是或包含表示相对或绝对时间的标志。要将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更新为payload中指定的时间格式。