Android API 21 - 底部视图 IndexOutOfBoundsException

4

我在我的应用程序中有一个使用了footerView的ListView。除了那些API 21的设备,我的代码在所有设备上都可以正常工作:我得到了一个IndexOutOfBoundsException。

我的ListView包含一个分类,这个分类可以通过下拉列表以不同的方式排序。每当我第二次更改分类顺序时,我的应用程序就会崩溃。

这是我的onCreate中的代码:

    //ListView
    classement_listview = (ListView) findViewById(R.id.classement_listview);
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    footer_view = inflater.inflate(R.layout.classement_listview_footer, null);
    classement_listview.addFooterView(footer_view);
    classementAdapter = new ClassementAdapter();
    classement_listview.setAdapter(classementAdapter);

    //Spinner
    Spinner spinner = (Spinner) findViewById(R.id.spinner_sort_by);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.classement_sort_by_entries, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    spinner.setOnItemSelectedListener(this);

这是我在onItemSelected(下拉列表的监听器)中所做的操作。
    classement_listview.removeFooterView(footer_view);
    classementAdapter.clearUsers();
    classement_viewflipper.setDisplayedChild(0);
    new Thread(new Runnable() {
        @Override
        public void run() {
            classementService.getClassement(ClassementActivity.this, typeClassement, countNbusers);
        }
    }).start();

这里是更新ListView的方法:

@Override
public void onClassementReceived(Classement classement) {
    if (classement == null) {
        classement_viewflipper.setDisplayedChild(2);
        return;
    }
    classement_viewflipper.setDisplayedChild(1);

    List<User> users = classement.getUsers();
    classementAdapter.addUsers(users);
    this.countNbusers += users.size();
    if (countNbusers >= classement.getNbMaxUsers()) {
        if (classement_listview.getFooterViewsCount() == 0)
            classement_listview.addFooterView(footer_view);
    } else
        classement_listview.removeFooterView(footer_view);

    classementAdapter.notifyDataSetChanged();
}

这是错误信息:

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:3307)
        at android.view.View.draw(View.java:15117)
        ... (etc) ...

感谢您的帮助!

你在哪一行遇到了异常? - natario
我不知道,异常的堆栈跟踪没有显示我的代码行。我发现唯一的逃避这个异常的方法是注释掉所有带有我的页脚视图的行。 - jeromeC
我得到完全相同的结果,在删除页脚视图(classement_listview.removeFooterView(footer_view);)时出现异常,你找到了纠正它的方法吗? - Chol
我也遇到了同样的问题,在Android 4.4、5和6上都是如此。 - Marino
1个回答

0

我遇到了相同的问题,并通过一些测试发现这是因为我连续调用了两次list.removeFooterView(mFooterView),就像你一样。

第一次我在我的onResponse方法(在您的情况下是onClassmentReceived)中调用removeFooterView,然后我又在ScrollListener.onScroll()方法中再次调用它,我使用这个方法来确定何时加载下一页数据。

我正在努力更好地理解为什么会这样,但删除onScroll()方法中的调用后,在我所有的测试设备上都正常工作。 如果这对您也起作用,请告诉我,这样我们可能可以理解更多!:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接