android - 如何在 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()
解决方案
用于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();
}
推荐阅读
- c# - SPIRV-Cross 无法编译 DirectXShaderCompiler 编译的 hlsl 代码
- python - 给定一个输入句子,将其解析为 CFG
- list - 从序言中的矩阵(列表列表)中提取一列
- javascript - 消息事件将 discord.js 从 v12 更新到 v13
- css - HTML CSS 如何划分ta
- typescript - TypeScript 检查字符串是否是接口中的键值
- pyspark - 在 pyspark 上可视化决策树?
- php - 为 foreach() laravel 8 提供的参数无效
- three.js - 我们什么时候需要使用 renderer.outputEncoding = THREE.sRGBEncoding
- json - Flutter Quiz Api 尝试调用 []() NoSuchMethodError