0

내 안드로이드 애플 리케이션에서 listView에서 행을 삭제하려고하면 ArrayIndexOutOfBoundsException이 발생합니다. 다음 코드입니다 :왜 ListView android에서 행을 삭제하려고하면 ArrayIndexOutOfBoundsException이 발생합니까?

String[] items; 
FileInputStream fis; 
String FILENAME = "rundata"; 
String collected; 
Context context = this; 
int itemPosition; 
FileOutputStream fos; 
ArrayAdapter<String> adapter; 
private static LayoutInflater inflater=null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    collected = null; 

    try { 
     fis = openFileInput(FILENAME); 
     byte[] dataArray = new byte[fis.available()]; 
     while(fis.read(dataArray) != -1){ 
      System.out.println("in while"); 
      collected = new String(dataArray); 
      if(collected.equals("")){ 
       System.out.println("break"); 
       break; 
      }else{ 
       System.out.println("continue"); 
      } 
     } 
     fis.close(); 

     if(collected.contains("NEXTLINE")){ 
      System.out.println("in if next line"); 
      items = collected.split("NEXTLINE"); 
     }else{ 
      System.out.println("in else next line"); 
      items = new String[0]; 
     } 


     System.out.println("items.length: "+items.length); 

     adapter = new ArrayAdapter<String>(this, R.layout.historyrow, items){ 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       View vi = convertView; 

       if (null == vi) { 
        vi = inflater.inflate(R.layout.historyrow, null); 
       } else { 
        vi = convertView; 
       } 

       TextView text=(TextView)vi.findViewById(R.id.historyTxtTitle); 

       JSONObject jObject; 
       try { 
        jObject = new JSONObject(items[position]); 
        if(jObject.getString("activityMode").equals("mode1")){ 
         text.setText("Mode 1"); 
        }else if(jObject.getString("activityMode").equals("mode2")){ 
         text.setText("Mode 2"); 
        }else if(jObject.getString("activityMode").equals("mode3")){ 
         text.setText("Mode 3"); 
        }else if(jObject.getString("activityMode").equals("mode4")){ 
         text.setText("Mode 4"); 
        }else{ 
         text.setText("ERROR"); 
        } 

       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        System.out.println("++++++e: "+e); 
       } 

       return vi; 
      } 

     }; 

     setListAdapter(adapter); 

내가 행 삭제하려고하면 나는 오류를 다음 얻을 :

06-28 11:15:10.593: E/AndroidRuntime(26639): FATAL EXCEPTION: main 
06-28 11:15:10.593: E/AndroidRuntime(26639): java.lang.ArrayIndexOutOfBoundsException 
06-28 11:15:10.593: E/AndroidRuntime(26639): at com.eplinovo.runnoandroid.HistoryViewActivity$1.getView(HistoryViewActivity.java:88) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.AbsListView.obtainView(AbsListView.java:1443) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.ListView.makeAndAddView(ListView.java:1793) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.ListView.fillDown(ListView.java:718) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.ListView.fillSpecific(ListView.java:1350) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.ListView.layoutChildren(ListView.java:1624) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.AbsListView.onLayout(AbsListView.java:1294) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.View.layout(View.java:7175) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.ViewRoot.performTraversals(ViewRoot.java:1146) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.os.Looper.loop(Looper.java:130) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at android.app.ActivityThread.main(ActivityThread.java:3687) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at java.lang.reflect.Method.invokeNative(Native Method) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at java.lang.reflect.Method.invoke(Method.java:507) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
06-28 11:15:10.593: E/AndroidRuntime(26639): at dalvik.system.NativeStart.main(Native Method) 

누군가가 나를 도와 주실 수 있습니까? 미리 감사드립니다.

답변

0

목록 어댑터에는 getCount이라는 메서드가 있기 때문에 어댑터는 항목 수를이 메서드에서 반환하는 상수 값으로 가정합니다. 행을 삭제 한 후에는 어댑터의 notifyDataSetChanged 메서드를 호출해야하므로 배열의 요소 수를 다시 계산합니다.