2015-03-29 2 views
4

У меня есть ListView в моем приложении, в котором используется footerView. Мой код хорошо работает на всех устройствах, кроме API 21: я получил исключение IndexOutOfBoundsException. My ListView содержит класс, и этот кластер можно сортировать по-разному с помощью счетчика. Мое приложение разбивается каждый раз, когда я меняю порядок своей классификации во второй раз.Android API 21 - просмотр нижнего колонтитула IndexOutOfBoundsException

Это мой код в 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) ... 

Благодарим за помощь!

+0

На какой линии вы получаете исключение? – natario

+0

Я понятия не имею, стек stacktrace исключений не показывает строку моего кода. Единственный способ избежать этого исключения - прокомментировать все строки с помощью footer_view. – jeromeC

+0

Я получаю excatly то же самое, исключение появляется при удалении нижнего колонтитула (classement_listview.removeFooterView (footer_view);) нашел ли вы способ исправить его? – Chol

ответ

0

У меня была такая же проблема, и, проведя некоторые тесты, я понял, что это происходит, потому что у меня есть два последовательных обращения к list.removeFooterView(mFooterView), как и у вас.

В первый раз я вызываю removeFooterView в свой метод onResponse (onClassmentReceived в вашем случае), а затем я вызываю его снова в методе ScrollListener.onScroll(), который я использую, чтобы узнать, когда загружать следующую страницу данных.

Я работаю над тем, чтобы лучше понять, почему, но удаляя invokation в методе onScroll(), все работает отлично на всех моих тестовых устройствах. Пожалуйста, дайте мне знать, если это работает для вас, так что, возможно, мы сможем понять что-то еще! :)

Смежные вопросы