重新填充 ArrayList 后出现 IndexOutOfBoundsException(仅限 Marshmallow)

IndexOutOfBoundsException after repopulating ArrayList (Marshmallow only)

我的设置如下:在我的 onCreate 中,我按如下方式初始化 ArrayList:

textList = new ArrayList<HashMap<String, String>>();

// unrelated code ...

if (isConnected()) {
    new DisplayTextTask().execute(sectionId);
}

并且 AsyncTask 通过 HttpURLConnection() 获取文本,使用 JsonReader 解析 json,并将每一行文本添加到 textList(所有这些都发生在 AsyncTask 的 doInBackground。我有一个自定义适配器,它显示 textList.

中的字符串

我还有一个函数 gotoNextSection(),当用户想要导航到下一页时会触发该函数,我会在其中执行以下操作:

gotoNextSection() {
    if (isConnected()) {
        new DisplayTextTask().execute(sectionId+1);
    }
}

但是,由于我不希望上一页中的陈旧文本保留在屏幕上,因此我在我的 AsyncTask 中执行了以下操作:

private class DisplayTextTask extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        textList.clear();
    }

    @Override
    protected String doInBackground(String... urls) {
        // json parsing is called in getData()
        try {
            return getData(urls[0]);
        } catch (IOException e) {
            return "Could not load text";
        }
    }

以便 arrayList 为空并准备重新填充。 所有这些在所有其他受支持的 Android 版本中工作正常,但是当我在 Marshmallow 模拟器中尝试它时 gotoNextSection() 导致 IndexOutOfBoundsException。 这发生在新内容之后被添加到新清除的 arrayList(通过日志记录验证),所以我不认为这是竞争条件。请注意,不清除列表可防止出现异常,并且由于这是 Activity 中使用的唯一 ArrayList,我肯定 .clear() 是问题所在。在启动 AsyncTask 作为替代方案之前,我也尝试过将其清零并重新初始化,但无济于事。 同样,这只发生在 Android 6.0。 想法?

编辑: 这是 logcat 堆栈跟踪。请注意,它试图访问的索引的大小以及它在代码中发生的位置是无关紧要的,因为我已经尝试在 gotoNextSection 中执行任务后记录 ArrayList 并且它只是给了我任何索引的异常我尝试在日志中访问。

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
        at java.util.ArrayList.get(ArrayList.java:308)
        at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
        at android.widget.ListView.dispatchDraw(ListView.java:3329)
        at android.view.View.draw(View.java:16181)
        at android.widget.AbsListView.draw(AbsListView.java:4142)
        at android.view.View.updateDisplayListIfDirty(View.java:15174)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
        at android.view.Choreographer.doCallbacks(Choreographer.java:670)
        at android.view.Choreographer.doFrame(Choreographer.java:606)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

已解决:我最终不得不在调用 clear 之前断开适配器与 ListView 的连接,然后在 postExecute() 中重新连接它,我猜 Marshmallow 对数据绑定更严格