简体   繁体   English

从回收商视图中删除物品时,如何通知onBindViewHolder?

[英]How do I notify onBindViewHolder when an item is removed from the recycler view?

So the scenario of my problem is I want to delete one row from the RecyclerView but it give me the error 所以我的问题的情况是我想从RecyclerView删除一行,但它给我错误

Inconsistency detected. 检测到不一致。 Invalid view holder adapter 无效的视图支架适配器

My code snippet are: 我的代码段是:

     @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
    }

And this is the code of my dialog: 这是我的对话框的代码:

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


}

So the problem is when I called removeItemFromView from my Interface Implemented method It does not update onBindViewHolder want to know how to notify onBindViewHolder that an item is removed. 所以问题是当我从接口实现的方法中调用removeItemFromView ,它不更新onBindViewHolder想知道如何通知onBindViewHolder某项已被删除。

try this code in your removeItemFromView 在您的removeItemFromView尝试此代码

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

First the getItemCount should return the size of the list. 首先,getItemCount应该返回列表的大小。 Here , imageGalleryList. 在这里,imageGalleryList。

Then just call notifyItemRemoved(position) alone. 然后只需单独调用notifyItemRemoved(position)。

public void removeItemFromView(int position) {
    this.imageGalleryList.remove(position);
    notifyItemRemoved(position);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM