android - Recyclerview notifyItemRemoved 删除了错误的项目,并且在使用视图绑定时无法正常工作
问题描述
从回收站视图中删除项目时,它无法正常工作。例如,如果您从头开始删除它会删除其他未按下的项目,或者即使您按下它也不会删除其中一些项目
活动课
List<ModelPlayers> modelPlayers = new ArrayList<>();
modelPlayers.add(new ModelPlayer(R.drawable.photo_ronaldo,"Ronaldo"));
modelPlayers.add(new ModelPlayer(R.drawable.photo_messi,"Messi"));
modelPlayers.add(new ModelPlayer(R.drawable.photo_neymar,"Neymar"));
modelPlayers.add(new ModelPlayer(R.drawable.photo_mbappe,"Mbappe"));
modelPlayers.add(new ModelPlayer(R.drawable.photo_ramos,"Ramos"));
LinearLayoutManager llm= new LinearLayoutManager(activity);
mRecyclerView.setLayoutManager(llm);
mRecyclerView.setHasFixedSize(true);
AdapterPlay adapterPlay= new AdapterPlay(activity, modelPlayers);
mRecyclerView.setAdapter(adapterPlay);
适配器类
public class AdapterPlay extends RecyclerView.Adapter<AdapterPlay.PlayerViewHolder> {
public static class PlayerViewHolder extends RecyclerView.ViewHolder {
PlayerViewHolder(View itemView) {
super(itemView);
}
}
private Activity mActivity;
private List<ModelPlayers> modelPlayers = new ArrayList<>();
private ItemPlayBinding mBinding;
public AdapterPlay(Activity activity, List<ModelPlayers> modelPlayers) {
this.mActivity=activity;
this.modelPlayers = modelPlayers;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public PlayerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
mBinding= ItemPlayBinding.inflate(LayoutInflater.from(mActivity),viewGroup,false);
return new PlayerViewHolder(mBinding.getRoot());
}
@Override
public void onBindViewHolder(PlayerViewHolder PlayerViewHolder, int i) {
ModelPlayers modelPlayer = this.modelPlayers.get(i);
mBinding.mainImage.setImageResource(modelPlayer.getImage());
mBinding.mainText.setText(modelPlayer.getTitle());
mBinding.mainText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
modelPlayers.remove(i);
notifyItemRemoved(i);
// notifyItemRangeChanged(i,modelPlays.size());
}
});
}
@Override
public int getItemCount() {
return modelPlayers.size();
}
}
解决方案
我终于发现问题存在是因为适配器类中视图绑定的使用不当。
仅从适配器类进行更改。
public class AdapterPlay extends RecyclerView.Adapter<AdapterPlay.PlayerViewHolder> {
public static class PlayerViewHolder extends RecyclerView.ViewHolder {
//made changes here, placing the binding here in the viewholder
private ItemPlayBinding mBinding;
PlayerViewHolder(ItemPlayBinding binding){
super(binding.getRoot());
mBinding = binding;
}
}
private Activity mActivity;
private List<ModelPlayer> modelPlayers = new ArrayList<>();
public AdapterPlay(Activity activity, List<ModelPlayer> modelPlayers) {
this.mActivity=activity;
this.modelPlayers = modelPlayers;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public PlayerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
//made changes here
return new PlayerViewHolder(ItemPlayBinding.inflate(
LayoutInflater.from(mActivity),viewGroup,false));
}
@Override
public void onBindViewHolder(PlayerViewHolder playerViewHolder, int i) {
ModelPlayer modelPlayer = this.modelPlayers.get(i);
//instead of the first mbinding.view I know make it viewholder.mbinding.view
playerViewHolder.mBinding.mainImage.setImageResource(modelPlayer.getImage());
playerViewHolder.mBinding.mainText.setText(modelPlayer.getTitle());
playerViewHolder.mBinding.mainText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
modelPlayers.remove(i);
notifyItemRemoved(i);
notifyItemRangeChanged(i,getItemCount());
}
});
}
@Override
public int getItemCount() {
return modelPlayers.size();
}
}
推荐阅读
- javascript - Lodash差异通过澄清
- cron - 如何在启用调试的情况下安装 cron?
- python - 自定义嵌套圆环图 - Python
- arrays - 如何从多个文件中提取特定模式行并获取每行修改的文件名和日期 - Powershell
- swift - iPad 上的 SwiftUI 导航 - 如何显示主列表
- android - 从 java 调用 kotlin 的函数 -> -source 1.7 不支持 lambda 表达式
- c# - 注销后无法立即使 Asp.Net cookie 无效
- python - 如何使用 DF2 中的值使用 A 列和 B 列在 DF1 上创建 C 列
- java - 从 Activity 调用 Fragment 视图中的按钮
- delphi - Delphi如何让Win10电脑进入待机模式?