首页 > 解决方案 > 如何在 onBindViewHolder() 中的 notifyItemChange() 之后为 recyclerView 元素中的子视图设置动画

问题描述

我想在调用时为 atextView内部设置动画recyclerView以向上过渡notifyItemChanged(position)。这是我onBindViewholder()在适配器发生更改时自动调用的:

@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    if (unfoldedIndexes.contains(position)) { // if already unfolded
        bindUnfoldedState(holder, holder.getLayoutPosition());
    }else{ // show the folded state}
}

public void bindUnfoldedState(ViewHolder holder, int position){


    if(lc.isBtnEnabled()){
            holder.Price.setText("text");
            holder.Price.animate().alpha(1.0f).setDuration(500);
            holder.Price.animate().translationY(-38).setDuration(500);
            holder.checkText.animate().translationY(38).setDuration(500);
        }else {
            holder.Price.animate().alpha(0.0f).setDuration(500);
            holder.Price.animate().translationY(0).setDuration(500);
            holder.checkText.animate().translationY(0).setDuration(500);
        }

}

notifyItemChanged()的电话是fragment onClick这样的:

 ok.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
            // some changes to the data
            adapter.getLcns().get(Position).setBtnEnabled(true);
            adapter.notifyItemChanged(Position);
            }
}

isBtnEnabled()如果etBtnEnabled(true)调用 s 则为真。

问题是动画没有发生。通过日志,我可以确认onBindViewHolder()正在调用并且动画应该出现但它没有发生。

listView在转换为 a 之前我使用的是 anormalrecyclerView并且动画正在处理getView()

标签: androidanimationandroid-recyclerviewandroid-viewholder

解决方案


用于Adapter.notifyItemChanged(position, payload)将更新部署到已经可见的 ViewHolders:

点击:

ok.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view) {
        // some changes to the data
        adapter.getLcns().get(Position).setBtnEnabled(true);
        adapter.notifyItemChanged(Position, true);   // "true" is the payload
    }
}

适配器:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, List<Object> payloads) {
    if(payloads != null && !payloads.isEmpty()){  // update payloads, partial rebind
        Object lastPayload = payloads.get(payloads.size -1)); // in this case only last payload is meaningful
        if(lastPayload instanceof Boolean)
            bindUnfoldedState(holder, lastPayload);
    }else
        onBindViewHolder(holder, position);   // regular binding of item
}

public void bindUnfoldedState(ViewHolder holder, boolean unfold){
     if(unfold){ ... } 
     else { ... }
}

// you should also consider adding this override to prevent animation leaking when viewholder
// is recycled and reused for another position:
@Override
public void onViewRecycled(ViewHolder holder){
    holder.Price.animate().cancel();
    holder.checkText.animate().cancel();
}

推荐阅读