我有一个recyclerview显示我的数据。在我的适配器类中,在onBindViewHolder()内,我为按钮创建了一个侦听器,该按钮在单击时删除了一行。第一次可以很好地工作,但是如果我尝试删除项目,则位置值与列表大小没有改变的位置相同。

例如,我有一个4项目列表。我删除第三个项目(索引为2)。第4个项目进入第3个插槽,列表的大小变为3。如果我尝试删除第3个项目,则我得到一个IndexOutOfBoundsException,因为该项目的位置尚未更新,其索引仍为3,而大小为3。

这是我的onBindViewHolder()方法一部分的代码:

public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        ItemRegistered item = registeredList.get(position);
        if (holder.getItemViewType() == 0) {
            final RegisteredViewHolder registeredViewHolder = (RegisteredViewHolder) holder;
            registeredViewHolder.course.setText(item.getCourse());

            registeredViewHolder.btn.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {

                    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which){
                                case DialogInterface.BUTTON_POSITIVE:

                                    if (mButtonClickListener != null) {

                                        Log.d("i", Integer.toString(position));
                                        Log.d("list size:", Integer.toString(registeredList.size()));

                                        final String title = registeredList.get(position).getCourse();
                                        mButtonClickListener.onButtonClicked(title);
                                    }

                                    registeredList.remove(holder.getAdapterPosition());
                                    notifyItemRemoved(position);
                                    break;

                                case DialogInterface.BUTTON_NEGATIVE:
                                    //No button clicked
                                    break;
                            }
                        }
                    };

                    AlertDialog.Builder builder = new AlertDialog.Builder(registeredViewHolder.course.getContext());
                    builder.setMessage("Jeni të sigurtë që doni të çregjistroheni?").setPositiveButton("Po", dialogClickListener)
                            .setNegativeButton("Jo", dialogClickListener).show();

                }
            });
        }
}

最佳答案

尝试从列表中删除项目,然后通知适配器。

那就是替换这行...

registeredList.remove(holder.getAdapterPosition());
notifyItemRemoved(position);


remove(position);

现在只需创建一个方法并添加逻辑即可。

public void remove(int position){
registeredList.remove(position);
notifyItemRemoved(position);
// to animate the list deletion
notifyItemRangeChanged(position, getItemCount());
}


希望能帮助到你 :)

10-05 23:57