0

我的應用程序中有一個RecyclerView,我正在通過像購物車中手動搜索一樣向其添加項目。每行都有一個名稱以及一個可以輸入值的編輯文本。我正在使用ArrayList來存儲使用TextWatcher在編輯文本中輸入的數據。例如,假設我向RecyclerView添加兩個或三個項目(行),並嘗試在第一行,第二個或第三個項目(行)中輸入的值不在第一個編輯文本中,我得到一個IndexOutOfBoundsException錯誤。我嘗試了很多方法。沒有用。IndexOutOfBoundsException嘗試在回收視圖中的編輯文本中鍵入值

這是我的Adapter類。

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

} 

我的logCat。

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 
+1

需要2秒鐘的時間在調試器中運行該程序,並在引發異常的斷點處運行該程序。你會馬上看到你的列表是空的。 – njzk2

+0

是的,問題是當我嘗試在第一行中發生此類異常時在第二行中鍵入值而沒有鍵入值。如果我不是從第一名開始,我想要一個解決方案**將「0」**添加到其他地方。 –

+0

確保你的'_retData'數據已經加入到'items *'(在'add'方法中)的同時。然後在'_retData'列表中使用'set'而不是'add'。 (更好的是,使用一個對象來保存所有的數據) – njzk2

回答

1

您的變量_retData大小在開始時爲0.當您嘗試在第二個位置添加項目時,它已超出其界限。
您必須確保您的清單尺寸與回收商尺寸相同。
爲了做到這一點,你必須途徑:
1.在你的add函數中添加:

_retData.add(location, new String()); 
在你刪除功能的附加

_retData.remove(location); 

2.第二種方式,其我認爲更好,就是創建一個名爲MyItem的類,並讓它具有字段:名稱,數量,Pcode,工廠,retData。
然後,在您的回收站中創建一個MyItem列表,然後您需要密切關注其大小。它也更方便。

+0

謝謝,它的工作 –

相關問題