【问题标题】:IndexOutOfBoundsException when trying to type value in a edit text in a recyclerview尝试在回收站视图的编辑文本中键入值时出现 IndexOutOfBoundsException
【发布时间】:2016-09-29 15:13:33
【问题描述】:

我的应用中有一个 RecyclerView,我通过手动搜索向其中添加项目,就像在购物车中一样。每行都有一个名称以及一个我可以输入值的编辑文本。我正在使用 ArrayList 存储使用 TextWatcher 在 edit text 中输入的数据。例如,假设我在 RecyclerView 中添加了两个或三个项目(行),并尝试从第二个或第三个项目(行)的第一行的第一个 edit text 中输入值,我收到 IndexOutOfBoundsException 错误。我尝试了很多方法。没有任何工作。

这是我的适配器类。

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> {

    private List<String> itemsName, itemsQty, itemsPCode, itemPlant, _retData;
    private OnItemClickListener onItemClickListener;
    private LayoutInflater layoutInflater;
    public ArrayList myItems = new ArrayList();
    private Context context;

    public SelectItemAdapter(Context context) {
        layoutInflater = LayoutInflater.from(context);
        itemsName = new ArrayList<String>();
        itemsQty = new ArrayList<String>();
        itemsPCode = new ArrayList<String>();
        itemPlant = new ArrayList<String>();
        _retData = new ArrayList<String>();
    }


    @Override
    public SelectItemAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = layoutInflater.inflate(R.layout.custom_row_selected_item, parent, false);
        return new ItemHolder(itemView, this);
    }

    @Override
    public void onBindViewHolder(final SelectItemAdapter.ItemHolder holder, final int position) {
        holder.setItemName(itemsName.get(position));
        holder.setItemQty(itemsQty.get(position));
        holder.setItemPCode(itemsPCode.get(position));
        holder.setItemPlant(itemPlant.get(position));
        holder.numPicker.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                          int arg3) {
                // TODO Auto-generated method stub
            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                    _retData.add(position, arg0.toString());
            }
        });
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    public String retrieveData(int i) {
        return _retData.get(i);
    }

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

    public Object getItemName(int position) {
        return itemsName.get(position);
    }

    public Object getItemQty(int position) {
        return itemsQty.get(position);
    }

    public Object getItemPCode(int position) {
        return itemsPCode.get(position);
    }

    public Object getItemPlant(int position) {
        return itemPlant.get(position);
    }


    public void setOnItemClickListener(OnItemClickListener listener) {
        onItemClickListener = listener;
    }

    public OnItemClickListener getOnItemClickListener() {
        return onItemClickListener;
    }


    public interface OnItemClickListener {
        public void onItemClick(ItemHolder item, int position);
    }

    public void add(int location, String iName, String iQty, String iPCode, String iPlant) {
        itemsName.add(location, iName);
        itemsQty.add(location, iQty);
        itemsPCode.add(location, iPCode);
        itemPlant.add(location, iPlant);
        notifyItemInserted(location);
    }

    public void remove(int location) {
        if (location >= itemsName.size())
            return;

        itemsName.remove(location);
        notifyItemRemoved(location);
    }

    public static class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private SelectItemAdapter parent;
        TextView textItemName, txtPCode, txtAvailableQty, txtTempQty, txtPlant;
        Button bRemove;
        EditText numPicker;

        public ItemHolder(View itemView, SelectItemAdapter parent) {
            super(itemView);
            this.parent = parent;
            textItemName = (TextView) itemView.findViewById(R.id.txtProductName);
            txtAvailableQty = (TextView) itemView.findViewById(R.id.txtAvailbleQty);
            txtPCode = (TextView) itemView.findViewById(R.id.txtPCode);
            txtPlant = (TextView) itemView.findViewById(R.id.txtPlant);
            bRemove = (Button) itemView.findViewById(R.id.bRemove);
            numPicker = (EditText) itemView.findViewById(R.id.numberPicker);
            bRemove.setOnClickListener(this);
        }

        public void setItemName(CharSequence name) {
            textItemName.setText(name);
        }

        public void setItemQty(CharSequence name) {
            txtAvailableQty.setText(name);
        }

        public void setItemPCode(CharSequence name) {
            txtPCode.setText(name);
        }

        public void setItemPlant(CharSequence name) {
            txtPlant.setText(name);
        }

        public String getQtyNumber() {
            return numPicker.getText().toString();
        }

        public CharSequence getItemName() {
            return textItemName.getText();
        }


        @Override
        public void onClick(View v) {
            final OnItemClickListener listener = parent.getOnItemClickListener();
            if (listener != null) {
                listener.onItemClick(this, getPosition());
            }
        }
    }

    public class RetItem {
        public String _itemNumPic;
    }

}

我的日志猫。

05-31 19:39:57.394 30412-30412/com.ceatkelanisrilanka.dushanmadushanka.ceat E/InputEventSender: Exception dispatching finished signal.
05-31 19:39:57.394 30412-30412/com.ceatkelanisrilanka.dushanmadushanka.ceat E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
05-31 19:39:57.397 30412-30412/com.ceatkelanisrilanka.dushanmadushanka.ceat E/MessageQueue-JNI: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.add(ArrayList.java:147)
at com.ceatkelanisrilanka.dushanmadushanka.ceat.adapters.SelectItemAdapter$1.afterTextChanged(SelectItemAdapter.java:73)
at android.widget.TextView.sendAfterTextChanged(TextView.java:7695)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:9483)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:972)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:516)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33)
at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:121)
at android.widget.TextView.doKeyDown(TextView.java:5803)
at android.widget.TextView.onKeyDown(TextView.java:5616)
at android.view.KeyEvent.dispatch(KeyEvent.java:2619)
at android.view.View.dispatchKeyEvent(View.java:8411)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2361)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1709)
at android.app.Activity.dispatchKeyEvent(Activity.java:2702)
at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:534)
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:50)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:241)
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:50)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2276)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4020)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3982)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3680)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3737)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3713)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3874)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2208)
at android.view.inputmethod.InputMethodManager

【问题讨论】:

  • 需要 2 秒在调试器中运行它,并在其中抛出异常的断点。此时您会立即看到您的列表为空。
  • 是的,问题是当我尝试在第二行中键入一个值而没有在第一行中键入值时,会发生此异常。如果我不是从一开始就开始,我想要一个将“0”添加到其他地方的解决方案。
  • 确保您的_retDataitems* 同时添加了数据(在add 方法中)。然后在您的_retData 列表中使用set 而不是add。 (更好的是,使用一个对象来保存所有数据)

标签: java android arraylist android-recyclerview indexoutofboundsexception


【解决方案1】:

您的变量 _retData 在开始时的大小为 0。当您尝试在第二个位置添加项目时,它超出了它的范围。
您必须确保您列出的商品尺寸与您的回收商尺寸相同。
为此,您必须采取以下方式:
1.在你的添加函数中添加:

_retData.add(location, new String());

在您的删除功能中添加:

_retData.remove(location);

2。第二种方法,我认为更好,例如创建一个名为 MyItem 的类,并让它具有以下字段:Name、Qty、Pcode、Plant、retData。
然后,在您的回收站中创建一个 MyItem 列表,然后您必须注意它的大小。也更方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多