Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onBindViewHolder()上的位置不';无法使用项目删除更新_Android_Android Viewholder - Fatal编程技术网

Android onBindViewHolder()上的位置不';无法使用项目删除更新

Android onBindViewHolder()上的位置不';无法使用项目删除更新,android,android-viewholder,Android,Android Viewholder,我有一个recyclerview显示我的数据。在我的适配器类中,在onBindViewHolder()中,我为一个按钮创建了一个侦听器,该按钮在单击时删除一行。第一次很好,但是如果我尝试删除一个项目,位置值就和列表大小没有改变一样 例如,我有一个4项清单。我删除了第三项(索引为2)。第四项进入第三个插槽,列表大小变为3。如果我尝试删除第三个项目,我会得到一个索引AutofBoundsException,因为项目位置尚未更新,其索引仍然为3,而大小为3 以下是我的onBindViewHolder(

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

例如,我有一个4项清单。我删除了第三项(索引为2)。第四项进入第三个插槽,列表大小变为3。如果我尝试删除第三个项目,我会得到一个
索引AutofBoundsException
,因为项目位置尚未更新,其索引仍然为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);
使用<代码>移除(位置)

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

public void remove(int position){
registeredList.remove(position);
notifyItemRemoved(position);
// to animate the list deletion                
notifyItemRangeChanged(position, getItemCount());
}
希望有帮助:)