Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.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 Recyclerview_Android Viewholder - Fatal编程技术网

Android 从回收器视图中删除项目时,如何通知onBindViewHolder?

Android 从回收器视图中删除项目时,如何通知onBindViewHolder?,android,android-recyclerview,android-viewholder,Android,Android Recyclerview,Android Viewholder,因此,我的问题是,我想从RecyclerView中删除一行,但它给了我一个错误 检测到不一致。视图保持器适配器无效 我的代码片段是: @Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.textViewTitle.setText(imageGalleryList.get(position).title);

因此,我的问题是,我想从
RecyclerView
中删除一行,但它给了我一个错误

检测到不一致。视图保持器适配器无效

我的代码片段是:

     @Override
        public void onBindViewHolder(MyViewHolder holder, final int position) {

            holder.textViewTitle.setText(imageGalleryList.get(position).title);
            holder.textViewTitleDesc.setText(imageGalleryList.get(position).comment);
            holder.textViewImageCreateInfo.setText(imageGalleryList.get(position).createUserId + " "/*+ UtilityOfActivity.convertLongDateToShortDateTime(getJCImageBySerialResponse[position].createDate)*/);
            //  imageLoader.displayImage(getJCImageBySerialResponse[position].imageUrl, holder.uploadedImage);
            holder.btnDeleteImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


                    imagePosition = position;
//calling the custom dialog

                    CustomDialogTwoButtons.showDialog(context, Constant.calledByDataSheetImageGallery,
                            Constant.calledBy_delete_image_gallery,
                            Constant.Confirm_Image_Deletion, Constant.Confirm_Image_Deletion_Message,
                            Constant.DialogPositiveButton, Constant.DialogNegativeButton);

                }
            });
// override interface method
     public void dialogItemClick(Context context, String calledBy) {

            Toast.makeText(context, " " + imagePosition, Toast.LENGTH_SHORT).show();
            removeItemFromView(imagePosition);



        }
//method to remove item from the recycler view row
 public void removeItemFromView(int position) {

        this.imageGalleryList.remove(position);

        notifyItemChanged(position);
        notifyItemRemoved(position);
        notifyDataSetChanged();


        //removes the row
    }
这是我对话框的代码:

public class CustomDialogTwoButtons extends Activity
{
    public static void showDialog(final Context context, final String calledByFragment,
                                  final String calledBy,
                                  String title, String message,
                                  String positiveButton, String negativeButton) {

        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.getWindow().setBackgroundDrawableResource(R.color.transparent);
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setContentView(R.layout.custom_dialog_two_buttons);

        TextView txtTitle = (TextView) dialog.findViewById(R.id.txtTitle);
        TextView txtMessage = (TextView) dialog.findViewById(R.id.txtMessage);
        Button btnPositive = (Button) dialog.findViewById(R.id.btnPositive);
        Button btnNegative = (Button) dialog.findViewById(R.id.btnNegative);

        txtTitle.setText(title);
        txtMessage.setText(message);
        btnPositive.setText(positiveButton);
        btnNegative.setText(negativeButton);

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

                Toast.makeText(context, "Positive ", Toast.LENGTH_SHORT).show();

                CustomDialogInterface reference = null;

                if (calledByFragment.equalsIgnoreCase(Constant.calledByDataSheetOrderInfo)) {

                    if (calledBy.equalsIgnoreCase(Constant.DELETE_CUST_VOICE)) {
                        reference = new DataSheetOrderInfo();
                    }
                    else if (calledBy.equalsIgnoreCase(Constant.EDIT_CUST_VOICE)) {
                        reference = new DialogFragmentAddEditDeleteCustVoice();
                    } else if (calledBy.equalsIgnoreCase(Constant.ADD_CUST_VOICE)) {
                        reference = new DialogFragmentAddEditDeleteCustVoice();
                    }

                }
                else if(calledByFragment.equalsIgnoreCase(Constant.calledByCreateRepairOrderFragment))  {
                    if (calledBy.equalsIgnoreCase(Constant.DELETE_CUST_VOICE)) {
                        reference = new FragmentCreateRepairOrder();
                    } else if (calledBy.equalsIgnoreCase(Constant.EDIT_CUST_VOICE)) {
                        reference = new CustomDialogEditCustVoice();
                    } else if (calledBy.equalsIgnoreCase(Constant.ADD_CUST_VOICE)) {
                        reference = new FragmentCreateRepairOrder();
                    }
                }

                else if(calledByFragment.equalsIgnoreCase(Constant.calledByDataSheetImageGallery))  {

                    if (calledBy.equalsIgnoreCase(Constant.calledBy_delete_image_gallery)) {
                        reference = (CustomDialogInterface) new ImageUploadAdapter();
                    }
                }

                reference.dialogItemClick(context, calledBy);

                dialog.cancel();
            }

        });

        btnNegative.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "Negative ", Toast.LENGTH_SHORT).show();

                dialog.cancel();
            }
        });

        dialog.show();

    }

    public interface CustomDialogInterface {

         void dialogItemClick(Context context, String calledBy);
    }


}

因此,问题是,当我从我的接口实现方法调用
removietemfromView
时,它不会更新
onBindViewHolder
,我想知道如何通知
onBindViewHolder
项目已删除。

removietemfromView
中尝试此代码

public void removeItemFromView(int position) {
    try{
      this.imageGalleryList.remove(position);
      notifyItemRemoved(position);
      notifyItemRangeChanged(position, imageGalleryList.size())
      //removes the row
    } catch (Exception e){
      notifyDataSetChanged();
      e.printStackTrace();
    }
}

首先,getItemCount应该返回列表的大小。这里,图片画廊

然后只需单独调用notifyItemRemoved(位置)


同样的问题,问题是当removeItemFromView(int position)完成其执行时,它在dialogItemClick上返回,并且没有向onBlindViewHolder通知任何内容。您是否捕获到任何异常?相同的java.lang.IndexOutOfBoundsException:检测到不一致。无效项目位置5(偏移量:5).state:6请参见:将位置传递给showDialog,并在DialogItem中单击添加第三个参数,因为位置无法执行此操作,因为我在应用程序中使用对话框的位置不止一个,请调用相同的方法尝试在ViewHolder内单击Listners设置,并按如下方式获取layoutposition
int position=getLayoutPosition()注释已更改的项目(位置);已移除(位置)的项目;检查一下
public void removeItemFromView(int position) {
    this.imageGalleryList.remove(position);
    notifyItemRemoved(position);
}