Android-getAdapterPosition()在删除项目后返回-1

Android-getAdapterPosition()在删除项目后返回-1,android,android-recyclerview,Android,Android Recyclerview,标题说明了一切,我有一个RecyclerView,用于动态存储值,但一次只能存储一个项。该项包含3个textView 当我正常添加所有项目时,它会工作,但当我添加x个项目,然后删除最后一个项目,然后单击“提交”时,应用程序崩溃 我在viewholder中执行removeAt(getAdapterPosition(),其中'removeAt(int)是: 和提交按钮: promoConfirmBtn.setOnClickListener(new View.OnClickListener() {

标题说明了一切,我有一个
RecyclerView
,用于动态存储值,但一次只能存储一个项。该项包含3个
textView

当我正常添加所有项目时,它会工作,但当我添加x个项目,然后删除最后一个项目,然后单击“提交”时,应用程序崩溃

我在viewholder中执行
removeAt(getAdapterPosition()
,其中'removeAt(int)是:

和提交按钮:

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

                Gson gson = new Gson();
                if (postProductPromoAdapter.getGrosirList() == null){

                } else {
                    String grosirAddJson = gson.toJson(postProductPromoAdapter.getGrosirList());

                    Intent intent = new Intent();
                    intent.putExtra("grosirPromoPrice", grosirAddJson);
                    intent.putExtra("promoPrice", promoPriceET.getText().toString());
                    setResult(RESULT_OK, intent);
                    finish();
                }
            }
        });
getGrosirList()

    public GrosirAddList getGrosirList(){
        if (mAwesomeValidation.validate()){
            return this.grosirList;
        } else {
            return null;
        }
    }
基本上,“提交”按钮会验证
文本视图
,如果验证,则返回true

这就是发生错误的地方:

    minRangeET.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }

                @Override
                public void afterTextChanged(Editable s) {
                    if(!s.toString().equals("")){
                        grosirList.product_grosir_list.get(getAdapterPosition()).grosir_min = String.valueOf(s);
                    } else {
                        grosirList.product_grosir_list.get(getAdapterPosition()).grosir_min = null; // Error happens here
                    }
                }
            });
我将用户输入保存到适配器内的一个对象,以便稍后通过
TextWatcher

    if(grosirList.product_grosir_list.get(position).grosir_min == null) {
        ((FiturPromoHolder)holder).minRangeET.setText("");
    } else {
        ((FiturPromoHolder)holder).minRangeET.setText(grosirList.product_grosir_list.get(position).grosir_min);
    }

    if(grosirList.product_grosir_list.get(position).grosir_max == null) {
        ((FiturPromoHolder)holder).maxRangeET.setText("");
    } else {
        ((FiturPromoHolder)holder).maxRangeET.setText(grosirList.product_grosir_list.get(position).grosir_max);
    }

    if(grosirList.product_grosir_list.get(position).grosir_price == null) {
        ((FiturPromoHolder)holder).grossPriceET.setText("");
    } else {
        ((FiturPromoHolder)holder).grossPriceET.setText(grosirList.product_grosir_list.get(position).grosir_price);
    }
这是错误日志:

java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
at java.util.ArrayList.get(ArrayList.java:310)
at xx.PostProductPromoAdapter$FiturPromoHolder$1.afterTextChanged(PostProductPromoAdapter.java:236)
at android.widget.TextView.sendAfterTextChanged(TextView.java:7563)
at android.widget.TextView.setText(TextView.java:3920)
at android.widget.TextView.setText(TextView.java:3769)
at android.widget.EditText.setText(EditText.java:84)
at android.widget.TextView.setText(TextView.java:3744)
at com.basgeekball.awesomevalidation.helper.SpanHelper.setColor(SpanHelper.java:22)
at com.basgeekball.awesomevalidation.validators.ColorationValidator$1.execute(ColorationValidator.java:34)
at com.basgeekball.awesomevalidation.validators.Validator.checkFields(Validator.java:76)
at com.basgeekball.awesomevalidation.validators.ColorationValidator.trigger(ColorationValidator.java:25)
at com.basgeekball.awesomevalidation.AwesomeValidation.validate(AwesomeValidation.java:81)
at xx.getGrosirList(PostProductPromoAdapter.java:76)
at xx$3.onClick(PostProductPromoActivityRecycler.java:164)
更新:

我使用此选项检查项目是否有效:

public boolean filledCheck(int itemNumber){
    return this.grosirList.product_grosir_list.size() > 0
            && this.grosirList.product_grosir_list.get(itemNumber - 1).grosir_price != null
            && this.grosirList.product_grosir_list.get(itemNumber - 1).grosir_max != null
            && this.grosirList.product_grosir_list.get(itemNumber - 1).grosir_min != null;
}
这可以将值添加到
EditText
。值是使用
TextWatcher

    if(grosirList.product_grosir_list.get(position).grosir_min == null) {
        ((FiturPromoHolder)holder).minRangeET.setText("");
    } else {
        ((FiturPromoHolder)holder).minRangeET.setText(grosirList.product_grosir_list.get(position).grosir_min);
    }

    if(grosirList.product_grosir_list.get(position).grosir_max == null) {
        ((FiturPromoHolder)holder).maxRangeET.setText("");
    } else {
        ((FiturPromoHolder)holder).maxRangeET.setText(grosirList.product_grosir_list.get(position).grosir_max);
    }

    if(grosirList.product_grosir_list.get(position).grosir_price == null) {
        ((FiturPromoHolder)holder).grossPriceET.setText("");
    } else {
        ((FiturPromoHolder)holder).grossPriceET.setText(grosirList.product_grosir_list.get(position).grosir_price);
    }
更新,以下是整个适配器代码:

public boolean uploadProductLoading = true;

    private Context context;
    private AwesomeValidation mAwesomeValidation;

    public GrosirAddList grosirList = new GrosirAddList();

    private SharedPreferencesList sharedPreferencesList;
    private SharedPreferenceUtilities sharedPreferenceUtilities;
    private Utilities utilities;
    private UtilityUriHelper utilityUriHelper;

    // Allows to remember the last item shown on screen
    private int lastPosition = -1;


    // User information
    private String userIdString;
    private String userAliasString;
    private String userEmailString;
    private String loginSharedPrefsString;

    private String userId;
    private String userAlias;

    public PostProductPromoAdapter(Context context) {

        this.sharedPreferencesList = new SharedPreferencesList();
        this.sharedPreferenceUtilities = new SharedPreferenceUtilities();
        this.context = context;
        this.userIdString = sharedPreferencesList.userIDString;
        this.userAliasString = sharedPreferencesList.userAliasString;
        this.loginSharedPrefsString = sharedPreferencesList.loginSharedPreference;
        this.utilities = new Utilities();
        this.utilityUriHelper = new UtilityUriHelper();

        this.userId = sharedPreferenceUtilities.getValue(context, loginSharedPrefsString, userIdString);
        this.userAlias = sharedPreferenceUtilities.getValue(context, loginSharedPrefsString, userAliasString);
        this.mAwesomeValidation = new AwesomeValidation(ValidationStyle.COLORATION);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View productView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.activity_marketplace_upload_produk_fitur_promo_card, parent, false);
        return new FiturPromoHolder(productView);
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

        // Animation, disabled for now
//        setAnimation(holder.itemView, position);

        /*((FiturPromoHolder)holder).grossPriceDeleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                notifyItemRangeChanged(position, grosirList.product_grosir_list.size());
//                notifyDataSetChanged();
//                notifyItemRemoved(position);
//                notifyItemRangeChanged(position, grosirList.product_grosir_list.size());
            }
        });*/



        /*((FiturPromoHolder)holder).minRangeET.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if(!s.toString().equals("")){
                    if (grosirList.product_grosir_list.size() != 0){
                        grosirList.product_grosir_list.get(position).grosir_min = String.valueOf(s);
                    }
                } else {
                    if (grosirList.product_grosir_list.size() != 0){
                        grosirList.product_grosir_list.get(position).grosir_min = null;
                    }
                }
            }
        });

        ((FiturPromoHolder)holder).maxRangeET.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (!s.toString().equals("")) {
                    if (grosirList.product_grosir_list.size() != 0){
                        grosirList.product_grosir_list.get(position).grosir_max = String.valueOf(s);
                    }
                } else {
                    if (grosirList.product_grosir_list.size() != 0){
                        grosirList.product_grosir_list.get(position).grosir_max = null;
                    }
                }
            }
        });

        ((FiturPromoHolder)holder).grossPriceET.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (!s.toString().equals("")) {
                    if (grosirList.product_grosir_list.size() != 0){
                        grosirList.product_grosir_list.get(position).grosir_price = String.valueOf(s);
                    }
                } else {
                    if (grosirList.product_grosir_list.size() != 0){
                        grosirList.product_grosir_list.get(position).grosir_price = null;
                    }
                }
            }
        });*/

        int x = holder.getLayoutPosition();

        if(grosirList.product_grosir_list.get(x).grosir_min != null) {
            ((FiturPromoHolder)holder).minRangeET.setText(grosirList.product_grosir_list.get(x).grosir_min);
        } else {
            ((FiturPromoHolder)holder).minRangeET.setText(null);
        }

        if(grosirList.product_grosir_list.get(x).grosir_max != null) {
            ((FiturPromoHolder)holder).maxRangeET.setText(grosirList.product_grosir_list.get(x).grosir_max);
        } else {
            ((FiturPromoHolder)holder).maxRangeET.setText(null);
        }

        if(grosirList.product_grosir_list.get(x).grosir_price != null) {
            ((FiturPromoHolder)holder).grossPriceET.setText(grosirList.product_grosir_list.get(x).grosir_price);
        } else {
            ((FiturPromoHolder)holder).grossPriceET.setText(null);
        }
    }

    /**
     * Here is the key method to apply the animation
     */
    private void setAnimation(View viewToAnimate, int position)
    {
        // If the bound view wasn't previously displayed on screen, it's animated
        if (position > lastPosition)
        {
            viewToAnimate.clearAnimation();
//            Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
            Animation animation = AnimationUtils.loadAnimation(context, R.anim.fade_in);
            viewToAnimate.startAnimation(animation);
            lastPosition = position;
        }
    }

    public boolean filledCheck(int itemNumber){
        return this.grosirList.product_grosir_list.size() > 0
                && this.grosirList.product_grosir_list.get(itemNumber - 1).grosir_price.trim().length() > 0
                && this.grosirList.product_grosir_list.get(itemNumber - 1).grosir_max.trim().length() > 0
                && this.grosirList.product_grosir_list.get(itemNumber - 1).grosir_min.trim().length() > 0;
    }

    private void removeAt(int removePosition){
        grosirList.product_grosir_list.remove(removePosition);
//        notifyItemRemoved(removePosition);
//        notifyItemRangeChanged(removePosition, grosirList.product_grosir_list.size());
//        notifyDataSetChanged();
        notifyItemRemoved(removePosition);
        notifyDataSetChanged();
//        notifyItemRangeRemoved(removePosition, grosirList.product_grosir_list.size());

//        notifyItemRangeChanged(removePosition, grosirList.product_grosir_list.size());
    }

    private void removeRange(int removePosition){
        int tempSize = grosirList.product_grosir_list.size();
        for (int i = removePosition; i < tempSize; i++){
            grosirList.product_grosir_list.remove(removePosition);
//            notifyItemRemoved(i);
        }
        notifyDataSetChanged();
//        notifyItemRangeRemoved(removePosition, grosirList.product_grosir_list.size());
//        notifyItemRangeChanged(0, this.grosirList.product_grosir_list.size());
    }

    private void clearAnimation(View viewToAnimate, int position)
    {
        // If the bound view wasn't previously displayed on screen, it's animated
        viewToAnimate.clearAnimation();
    }

    public void addGrosirList(GrosirAddList dataset){
        this.grosirList.product_grosir_list.addAll(dataset.product_grosir_list);
        notifyDataSetChanged();
//        notifyItemInserted(grosirList.product_grosir_list.size() - 1);
//        this.grosirList.add(grosirList.size(), dataset.product_grosir_list.get());
//        notifyItemInserted(grosirList.size() - 1);
    }

    public GrosirAddList getGrosirList(){
        if (mAwesomeValidation.validate()){
            return this.grosirList;
        } else {
            return null;
        }
//        return this.grosirList;
    }

    @Override
    public int getItemCount() {
        return grosirList.product_grosir_list.size();
    }

    public class FiturPromoHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        Handler handler;
        RelativeLayout minRangeWrapper;
        OpenSansEditText minRangeET;
        RelativeLayout maxRangeWrapper;
        OpenSansEditText maxRangeET;
        RelativeLayout grossPriceWrapper;
        OpenSansEditText grossPriceET;
        OpenSansButton grossPriceDeleteBtn;

        public FiturPromoHolder(View promoView) {
            super(promoView);
            minRangeWrapper = (RelativeLayout)promoView.findViewById(R.id.fragment_marketplace_upload_produk_fitur_promo_card_minRangeWrapper);
            minRangeWrapper.setOnClickListener(this);
            minRangeET = (OpenSansEditText)promoView.findViewById(R.id.fragment_marketplace_upload_produk_fitur_promo_card_minRangeET);
            maxRangeWrapper = (RelativeLayout)promoView.findViewById(R.id.fragment_marketplace_upload_produk_fitur_promo_card_maxRangeWrapper);
            maxRangeWrapper.setOnClickListener(this);
            maxRangeET = (OpenSansEditText)promoView.findViewById(R.id.fragment_marketplace_upload_produk_fitur_promo_card_maxRangeET);
            grossPriceWrapper = (RelativeLayout)promoView.findViewById(R.id.fragment_marketplace_upload_produk_fitur_promo_card_grossPriceWrapper);
            grossPriceWrapper.setOnClickListener(this);
            grossPriceET = (OpenSansEditText)promoView.findViewById(R.id.fragment_marketplace_upload_produk_fitur_promo_card_grossPriceET);
            grossPriceDeleteBtn = (OpenSansButton)promoView.findViewById(R.id.fragment_marketplace_upload_produk_fitur_promo_card_grossPriceDeleteBtn);
            grossPriceDeleteBtn.setOnClickListener(this);
            this.setIsRecyclable(false);
            handler = new Handler();
            minRangeET.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(final CharSequence s, int start, int before, int count) {
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            grosirList.product_grosir_list.get(getLayoutPosition()).grosir_min = String.valueOf(s);
                        }
                    }, 200);
                }

                @Override
                public void afterTextChanged(Editable s) {
                }
            });

            maxRangeET.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(final CharSequence s, int start, int before, int count) {
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            grosirList.product_grosir_list.get(getLayoutPosition()).grosir_max = String.valueOf(s);
                        }
                    }, 200);
                }

                @Override
                public void afterTextChanged(Editable s) {
                }
            });

            grossPriceET.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(final CharSequence s, int start, int before, int count) {
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            grosirList.product_grosir_list.get(getLayoutPosition()).grosir_price = String.valueOf(s);
                        }
                    }, 200);
                }

                @Override
                public void afterTextChanged(Editable s) {
                }
            });

            grossPriceET.addTextChangedListener(new NumberTextWatcher(grossPriceET));

            mAwesomeValidation.addValidation(minRangeET, RegexTemplate.NOT_EMPTY, "Jumlah minimum tidak boleh kosong");
            mAwesomeValidation.addValidation(maxRangeET, RegexTemplate.NOT_EMPTY, "Jumlah maximum tidak boleh kosong");
            mAwesomeValidation.addValidation(grossPriceET, RegexTemplate.NOT_EMPTY, "Harga tidak boleh kosong");
        }

        @Override
        public void onClick(View v) {
            if (v.equals(grossPriceDeleteBtn)) {
                int removePosition = getAdapterPosition();
                try {
                    grosirList.product_grosir_list.remove(removePosition);
                    notifyItemRemoved(removePosition);
                    notifyDataSetChanged();
                    minRangeET.setError(null);
                    maxRangeET.setError(null);
                    grossPriceET.setError(null);
//
                    mAwesomeValidation.addValidation(minRangeET, RegexTemplate.NOT_EMPTY, "Jumlah minimum tidak boleh kosong");
                    mAwesomeValidation.addValidation(maxRangeET, RegexTemplate.NOT_EMPTY, "Jumlah maximum tidak boleh kosong");
                    mAwesomeValidation.addValidation(grossPriceET, RegexTemplate.NOT_EMPTY, "Harga tidak boleh kosong");
                }catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();}
            } else if(v.equals(minRangeWrapper)) {
                minRangeET.requestFocusFromTouch();
            } else if(v.equals(maxRangeWrapper)) {
                maxRangeET.requestFocusFromTouch();
            } else if(v.equals(grossPriceWrapper)) {
                grossPriceET.requestFocusFromTouch();
            }
        }
    }
public boolean uploadProductLoading=true;
私人语境;
私有AwesomeValidation-mAwesomeValidation;
public grosiradlist grosirList=新的grosiradlist();
私有SharedReferencesList SharedReferencesList;
私人共享参考实用程序共享参考实用程序;
私人公用事业;
私人实用工具UriHelper实用工具UriHelper;
//允许记住屏幕上显示的最后一项
private int lastPosition=-1;
//用户信息
私有字符串userIdString;
私有字符串userAliasString;
私有字符串userEmailString;
私有字符串登录SharedPrefsString;
私有字符串用户标识;
私有字符串用户别名;
公共后处理适配器(上下文){
this.sharedPreferencesList=新的sharedPreferencesList();
this.SharedReferenceUtilities=新的SharedReferenceUtilities();
this.context=上下文;
this.userIdString=SharedReferencesList.userIdString;
this.userAliasString=SharedReferencesList.userAliasString;
this.loginsharedpreferencestring=sharedPreferencesList.loginSharedPreference;
this.utilities=新的utilities();
this.utilityUriHelper=新的utilityUriHelper();
this.userId=SharedReferenceUtilities.getValue(上下文、登录SharedRefersString、userIdString);
this.userAlias=SharedReferenceUtilities.getValue(上下文、登录SharedReferssString、userAliasString);
this.mAwesomeValidation=新的AwesomeValidation(ValidationStyle.COLORATION);
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View productView=LayoutInflater.from(parent.getContext())
.充气(R.layout.activity\u marketplace\u upload\u produk\u fitur\u promo\u card,家长,假);
退回新的FiturPromoHolder(productView);
}
@凌驾
公共无效onBindViewHolder(最终RecyclerView.ViewHolder,最终整型位置){
//动画,暂时禁用
//设置动画(holder.itemView,位置);
/*((FiturPromoHolder)holder).grossPriceDeleteBtn.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
//notifyItemRangeChanged(位置,grosirList.product_grosir_list.size());
//notifyDataSetChanged();
//已移除(位置)的项目;
//notifyItemRangeChanged(位置,grosirList.product_grosir_list.size());
}
});*/
/*((FiturPromoHolder)holder.minRanget.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
@凌驾
公共无效后文本已更改(可编辑){
如果(!s.toString().equals(“”){
if(grosirList.product\u grosir\u list.size()!=0){
grosirList.product\u grosir\u list.get(position.grosir\u min=String.valueOf(s);
}
}否则{
if(grosirList.product\u grosir\u list.size()!=0){
grosirList.product\u grosir\u list.get(position).grosir\u min=null;
}
}
}
});
((FiturPromoHolder)holder.maxranget.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
@凌驾
公共无效后文本已更改(可编辑){
如果(!s.toString().equals(“”){
if(grosirList.product\u grosir\u list.size()!=0){
grosirList.product\u grosir\u list.get(position.grosir\u max=String.valueOf(s);
}
}否则{
if(grosirList.product\u grosir\u list.size()!=0){
grosirList.product\u grosir\u list.get(position.grosir\u max=null;
}
}
}
});
((FiturPromoHolder)holder).grossPriceET.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
@凌驾
公共无效后文本已更改(可编辑){
如果(!s.toString().equals(“”){
if(grosirList.product\u grosir\u list.size
private void removeAt(int removePosition){
    if(removePosition == -1)    
        return;
    grosirList.product_grosir_list.remove(removePosition);
    notifyItemRemoved(removePosition);
}