【问题标题】:Android IndexOutOfBoundsException in version 5.1Android 5.1 版中的 IndexOutOfBoundsException
【发布时间】:2015-11-24 20:07:29
【问题描述】:

每当用户尝试访问列表中的项目时,我的应用程序都会出现问题。此问题仅发生在 5.1 版(Xperia Z2 (D6503)、Z3 Compact Xperia (D5803))的设备上

该应用程序已经过测试并且在版本 (4.1) (4.4) (2.3.3)、(2.3.7)、(4.0.3)、(4.0.4) 上运行良好

错误报告说:

java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
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:3307)
at android.view.View.draw(View.java:15324)
at android.widget.AbsListView.draw(AbsListView.java:4114)
at android.view.View.updateDisplayListIfDirty(View.java:14257)
at android.view.View.getDisplayList(View.java:14279)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3390)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3369)
at android.view.View.updateDisplayListIfDirty(View.java:14217)
at android.view.View.getDisplayList(View.java:14279)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3390)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3369)
at android.view.View.updateDisplayListIfDirty(View.java:14217)
at android.view.View.getDisplayList(View.java:14279)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3390)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3369)
at android.view.View.updateDisplayListIfDirty(View.java:14217)
at android.view.View.getDisplayList(View.java:14279)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3390)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3369)
at android.view.View.updateDisplayListIfDirty(View.java:14217)
at android.view.View.getDisplayList(View.java:14279)
at android.view.View.draw(View.java:15049)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.View.updateDisplayListIfDirty(View.java:14252)
at android.view.View.getDisplayList(View.java:14279)
at android.view.View.draw(View.java:15049)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.View.updateDisplayListIfDirty(View.java:14252)
at android.view.View.getDisplayList(View.java:14279)
at android.view.View.draw(View.java:15049)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.View.updateDisplayListIfDirty(View.java:14252)
at android.view.View.getDisplayList(View.java:14279)
at android.view.View.draw(View.java:15049)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.View.updateDisplayListIfDirty(View.java:14252)
at android.view.View.getDisplayList(View.java:14279)
at android.view.View.draw(View.java:15049)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.View.updateDisplayListIfDirty(View.java:14252)
at android.view.View.getDisplayList(View.java:14279)
at android.view.View.draw(View.java:15049)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.View.draw(View.java:15324)
at android.widget.FrameLayout.draw(FrameLayout.java:598)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2653)
at android.view.View.updateDisplayListIfDirty(View.java:14257)
at android.view.View.getDisplayList(View.java:14279)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2540)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2356)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1986)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1065)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5901)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5373)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

我无法完全理解源代码的哪一部分有问题。所以我不知道代码的哪一部分必须贴在这里。有时,用户第一次按下元素列表时可以正常工作,但随后出现错误并且不允许再次访问。

以下代码展示了用户如何访问列表项:

 list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View viewClicked,
                                int position, long id) {

                itemList currentlog = (itemList )parent.getItemAtPosition(position);
                sendToFragmentInterface(currentlog.getUserId());
                MyLogs.clear();
        }
    });

此时,会打开一个包含用户个人资料详细信息的片段。但是,您可以从主菜单访问相同的片段并且运行良好。似乎……只有当您尝试从列表中访问时,应用程序才会崩溃。

这是界面:

public interface openUserProfile {
    public void getUserProfile(String user_id);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if (activity instanceof openUserProfile ) {
        listener = (openUserProfile ) activity;
    } else {
        throw new ClassCastException(activity.toString()
                + " must implemenet MyListFragment.interfazCambiaFragment");
    }
}

public void sendToFragmentInterface(String user_id) {

    listener.getUserProfile(user_id);
}

这是 MainActivity 中的代码“getUserProfile”,它持有调用并打开片段:

Bundle args = new Bundle();
    Fragment fragment = new UserProfile();

    args.putString("user_id",user_id);
    fragment.setArguments(args);

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment)
            .addToBackStack(null)
            .commit();

    setTitle("Profile");

该应用程序已经过测试并且在版本 (4.1) (4.4) (2.3.3)、(2.3.7)、(4.0.3)、(4.0.4) 上运行良好 ...谁能告诉我什么发生了什么?

【问题讨论】:

  • 错误在HeaderViewListAdapter:164。你能把这段代码贴出来吗?
  • @DeividiCavarzan 我的片段中没有任何标头适配器。 OnCreate 中只有这一行:'header = ((LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.header_profile, null);'
  • 当然,我的错,没看到包裹

标签: android android-fragments indexoutofboundsexception


【解决方案1】:

经过一段时间的分析,我意识到 mylogs.clear() 使用它后清理列表的行是导致错误的行。我把它放在那里是因为我认为我可以节省内存。高于 5.0 的 Android 版本不支持此功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2013-04-29
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多