首页 > 解决方案 > 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();
    }
}

标签: androidandroid-recyclerviewandroid-listview

解决方案


我终于发现问题存在是因为适配器类中视图绑定的使用不当。

仅从适配器类进行更改。

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();
    }
}

推荐阅读