onBindViewHolder()上的位置没有更新项目删除

时间:2016-07-01 15:03:37

标签: android android-viewholder

我有recyclerview显示我的数据。在我的适配器类onBindViewHolder()中,我创建了一个按钮的监听器,该按钮在单击时删除一行。第一次工作正常,但如果我尝试删除一个项目,位置值就像列表的大小没有改变一样。

所以例如我有一个4项目列表。我删除第3项(索引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();

                }
            });
        }
}

1 个答案:

答案 0 :(得分:1)

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

即取代这一行...

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

希望它有所帮助:)