Android API 21 - 页脚视图 IndexOutOfBoundsException

Posted

技术标签:

【中文标题】Android API 21 - 页脚视图 IndexOutOfBoundsException【英文标题】:Android API 21 - footer view IndexOutOfBoundsException 【发布时间】:2015-06-02 03:56:45 【问题描述】:

我的应用中有一个使用 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) ...

感谢您的帮助!

【问题讨论】:

您在哪一行得到异常? 我不知道,异常的堆栈跟踪没有显示我的任何代码行。我发现逃避此异常的唯一方法是用我的 footer_view 注释所有行。 我完全一样,删除页脚视图时出现异常 (classement_listview.removeFooterView(footer_view);) 你找到解决方法了吗? 我也遇到过,在 android 4.4、5 和 6 上也是如此。 【参考方案1】:

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

我第一次在我的 onResponse 方法中调用 removeFooterView(在你的情况下为 onClassmentReceived),然后我在 ScrollListener.onScroll() 方法中再次调用它,我用它来知道何时加载下一页数据。

我正在努力更好地理解原因,但删除 onScroll() 方法中的调用后,在我的所有测试设备上一切正常。 请让我知道这是否也适合您,这样也许我们可以了解更多! :)

【讨论】:

以上是关于Android API 21 - 页脚视图 IndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章

Android底页上的静态页脚视图

android listviews:页眉和页脚视图

Android底表上的静态页脚视图

Android 2.3.3 上的列表视图页脚背景

Android列表视图将内容包装到基于页脚大小的特定大小

推动页脚视图的软键盘