2016-04-27 41 views
-1

長話短說:我有一個帶有customAdapter的listView(稱爲MathAdapter)。此適配器處理CalculationModel類型的ArrayList。默認情況下,我的列表中有〜15個CalculationModels,但是在特殊情況下,我必須刪除它們中的大約6個。ArrayIndexOutOfBoundsException在操作ArrayAdapter時

因爲我非常新的Android開發(我是從iOS的未來),我的第一個基本問題是:

會在哪裏一個正常操作的ListData?在我的情況下,一個片段初始化適配器並傳遞我的數據列表。在我的應用程序的生命週期中,我操縱這個列表並調用notifiyDataSetChanged。一切都按預期工作,我可以一次刪除或添加1個CalculationModel,沒有任何問題。

刪除6個CalculationModels時也沒有問題,工作正常。當我嘗試應用程序崩潰與下面的錯誤日誌,以重新插入:

04-27 07:48:59.194 1766-1766/com.example.test E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.test, PID: 1766 
    java.lang.ArrayIndexOutOfBoundsException: length=11; index=11 
     at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:8271) 
     at android.widget.ListView.layoutChildren(ListView.java:1600) 
     at android.widget.AbsListView.onLayout(AbsListView.java:2528) 
     at android.view.View.layout(View.java:15655) 
     at android.view.ViewGroup.layout(ViewGroup.java:4856) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
     at android.view.View.layout(View.java:15655) 
     at android.view.ViewGroup.layout(ViewGroup.java:4856) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1440) 
     at android.view.View.layout(View.java:15655) 
     at android.view.ViewGroup.layout(ViewGroup.java:4856) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
     at android.view.View.layout(View.java:15655) 
     at android.view.ViewGroup.layout(ViewGroup.java:4856) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1440) 
     at android.view.View.layout(View.java:15655) 
     at android.view.ViewGroup.layout(ViewGroup.java:4856) 
     at com.example.test.TouchDisableView.onLayout(TouchDisableView.java:57) 
     at android.view.View.layout(View.java:15655) 
     at android.view.ViewGroup.layout(ViewGroup.java:4856) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
     at android.view.View.layout(View.java:15655) 
     at android.view.ViewGroup.layout(ViewGroup.java:4856) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
     at android.view.View.layout(View.java:15655) 
     at android.view.ViewGroup.layout(ViewGroup.java:4856) 
     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2284) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2004) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1236) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6471) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:603) 
     at android.view.Choreographer.doFrame(Choreographer.java:573) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:157) 
     at android.app.ActivityThread.main(ActivityThread.java:5356) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
     at dalvik.system.NativeStart.main(Native Method) 

要清楚,我不是新來的Java,和我看到的ArrayIndexOutOfBounds的問題,但我不知道哪裏發生這種情況,因爲我的名單和項目的適配器數均高於11(14如預期)

代碼:

List<CalculationModel> data; 
    List<CalculationModel> backupData = new ArrayList<>();  

@Override 
public void onResume() { 
    if (mathApp.isCleanPhase) { 
     removeNonClearData(); 
    } else { 
     addNonClearData(); 
    } 

    adapter.notifyDataSetChanged(); 

    super.onResume(); 
} 


    public void removeNonClearData() { 
    if (backupData.size() > 0) return; 

    for (int i = 0; i < data.size(); i++) { 
     CalculationModel tmp = data.get(i); 

     String sName = tmp.getSName(); 

     if (sName.equals("r") || sName.equals("wv") || sName.equals("qv") || sName.equals("tw") || sName.equals("ti") || sName.equals("h") || sName.equals("rs")) { 
      backupData.add(data.remove(i)); 
      i--; 
     } 
    } 

    adapter.itemCount = data.size(); 
} 

public void addNonClearData() { 
    if (backupData.size() == 0) return; 

    for (int i = 0; i < backupData.size(); i++) { 
     //'r' is a default parameter, which shall be in row 6 
     if (backupData.get(i).getSName().equals("r")) data.add(5, backupData.remove(i)); 
     else data.add(backupData.remove(i)); 
    } 

    adapter.itemCount = data.size(); 

    print(data.size()); 
} 

編輯:忘了提,得到的數據就被裝載我希望它的方式,但是當我在列表中再次滾動時,應用程序崩潰。所有的數據都在我想查看的列表中,但是當滾動時, - >崩潰。

提到的一樣,我只是不明白的地方這個錯誤來自於,因爲日誌沒有給出關於它的信息...

+0

你可以發佈代碼嗎? –

+0

添加代碼。希望它有助於 – glace

+0

錯誤發生在哪個列表?數據還是備份數據? – Opiatefuchs

回答

1

後無奈的很長一段時間(基本上是最後2天)和混亂我終於設法瞭解這個適配器的ListViews如何工作(至少我希望)。

正如問題中所述,我有以下設置: 一個包含數據列表的片段,以及在初始化時獲取此數據列表的適配器。

操作數據時,適配器有兩種不同的行爲。

如果一個人只是編輯在列表中的一個對象(例如,我想改變PARAM我CalculationModel的「價值」上的第4,一切工作正常,並接受更改與notifyDataSetChanged()。

如果一個從列表中刪除一個完整的對象,notifyDataSetChanged()也在工作,並在做預期的工作

但是,如果有人要添加一個新的對象到列表中,(或者在我的情況下,重新插入刪除一個)重新創建整個適配器是必要的,因爲notifyDataSetChanged()已經不再起作用了。

感謝您的幫助,我可能沒有在評論中輸入內容。

1
when you are removing data from array call notifyDataSetChanged(); 
+0

這已經是...的onResume已 – glace

+0

在調試檢查是恢復方法調用與否? –

+0

是的,它被稱爲。如預期的數據被操縱,然後滾動列表 – glace

相關問題