如何解决notifyItemChanged调用onCreateViewHolder
我的recyclerView适配器有一个奇怪的问题,我只想根据选择显示/隐藏ImageView,但是当我在点击监听器中调用notifyItemChanged(selection)
时,它会调用onCreateViewHolder
并接受延迟刷新视图,我不知道为什么,也没有找到其他解决方案来执行所需的操作。
这是我的适配器:
public class ChannelAdapter extends RecyclerView.Adapter<ChannelAdapter.ChannelHolder> {
private ArrayList<Integer> channelList;
private Integer selection = 0;
public ChannelAdapter(ArrayList<Integer> channelList) {
this.channelList = channelList;
}
@NotNull
@Override
public ChannelHolder onCreateViewHolder(ViewGroup parent,int viewType) {
Log.d(TAG,"onCreateViewHolder: ");
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_channel_item_selected,parent,false);
ChannelHolder holder = new ChannelHolder(view);
return holder;
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(ChannelHolder holder,int position) {
Log.d(TAG,"onBindViewHolder: "+position);
holder.textViewChannelId.setText("#"+channelList.get(position));
holder.textViewChannel.setText(channelList.get(position).toString());
if(position==selection){
holder.imageViewSelectorLeft.setVisibility(View.VISIBLE);
holder.imageViewSelectorRight.setVisibility(View.VISIBLE);
}
else{
holder.imageViewSelectorLeft.setVisibility(View.INVISIBLE);
holder.imageViewSelectorRight.setVisibility(View.INVISIBLE);
}
}
@Override
public int getItemCount() {
return channelList.size();
}
public class ChannelHolder extends RecyclerView.ViewHolder {
TextView textViewChannel,textViewChannelId;
ImageView imageViewSelectorLeft,imageViewSelectorRight;
public ChannelHolder(View itemView) {
super(itemView);
textViewChannelId = itemView.findViewById(R.id.textViewChannelId);
textViewChannel = itemView.findViewById(R.id.textViewChannel);
imageViewSelectorLeft = itemView.findViewById(R.id.imageViewSelectorLeft);
imageViewSelectorRight = itemView.findViewById(R.id.imageViewSelectorRight);
itemView.setonClickListener(v -> {
notifyItemChanged(selection);
selection=getAdapterPosition();
notifyItemChanged(selection);
});
}
}
}
我想念某件事还是做错了吗? 预先感谢您的帮助
编辑:
我尝试使用有效载荷设置为1的notifyItemChanged
并覆盖onBindViewHolder
来获得有效载荷,但是即使onCreateViewHolder
设置为false
mSupportsChangeAnimations
>解决方法
您可以像这样呼叫适配器
YourAdapter adapter = new YourAdapter(yourList,yourActivity.this);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
然后您可以将此代码放在适配器中的itemClick上
if(position==getAdapterPosition()){
holder.imageViewSelectorLeft.setVisibility(View.VISIBLE);
holder.imageViewSelectorRight.setVisibility(View.VISIBLE);
}
else{
holder.imageViewSelectorLeft.setVisibility(View.INVISIBLE);
holder.imageViewSelectorRight.setVisibility(View.INVISIBLE);
}
,
默认情况下,您的RecyclerView将附加一个DefaultItemAnimator
。当您在适配器上调用notifyItemChanged()
时,系统最终将调用DefaultItemAnimator
来查找是否需要创建新的ViewHolder
或是否可以“重用”现有的。
@Override
public boolean canReuseUpdatedViewHolder(@NonNull ViewHolder viewHolder,@NonNull List<Object> payloads) {
return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder,payloads);
}
超类实现:
@Override
public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) {
return !mSupportsChangeAnimations || viewHolder.isInvalid();
}
这些建议有两种简单的方法来确保重用ViewHolder
而不是重新创建它们:
- 确保
payloads
列表不为空。这是通过调用adapter.notifyItemChanged(position,payload)
完成的。只要payload
是非null,就无关紧要。 - 将
mSupportsChangeAnimations
的{{1}}设置为false
。
DefaultItemAnimator
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。