Android - прокрутка через ListView приводит к исключению Out of Bounds - PullRequest
2 голосов
/ 29 июля 2011

Я работаю над приложением, которое в основном состоит из представления списка.Он поддерживается моим собственным адаптером массива, размер которого меняется каждые 5 секунд.Если я прокручиваю представление списка, когда адаптер массива изменяется с большего размера на меньший, я получаю исключение вне границ.Для меня имеет смысл, почему это происходит (поскольку я прокручиваю позицию за пределами нового размера массива), но мне было интересно, есть ли хороший способ отладки.Кажется, я не могу прийти к четкому выводу, и мне было интересно, могу ли я получить некоторую помощь.

Я обновляю адаптер, используя следующую asyncTask ...

public class myTask extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            while(isRunning){
                myData.clear();
                getData();
                publishProgress();
                SystemClock.sleep(5000);
            }
            return null;
        }

        protected void onProgressUpdate(Void...progress){
            listAdapter.notifyDataSetChanged();

        }     
}

myData - это ArrayList, который поддерживает listAdapter, а getData() - это функция, которая заполняет myData соответствующей информацией, которая в конечном итоге будет отображаться в моем представлении списка.

Есть ли хороший способ решения этойпроблема?

С уважением

Ответы [ 4 ]

2 голосов
/ 24 февраля 2012

попробуйте переопределить функцию getCount () класса адаптера:

@Override
public int getCount() {
return [list that contains data].size();
}
2 голосов
/ 29 июля 2011

Вы используете нестандартный адаптер?

Возможно, в ваших getViewTypeCount () и getItemViewType (int position) он выходит за границы. Количество типов представления должно быть от (0, n], но тип представления элемента должен быть [0, n).

например. количество просмотров должно быть 2

Но типы представлений должны быть 0 и 1, а не 1 и 2.

0 голосов
/ 29 июля 2011

Извините, возможно, это не ответ на вопрос, но для меня этот бесконечный цикл кажется мне неправильным, даже если это асинхронная задача.

Я бы попробовал использоватьAlarmManager или Timer.

С учетом сказанного кажется, что у вас есть состояние гонки, примите во внимание, что это происходит не сразу, когда вы запрашиваете данные или конкретную позицию и перестраиваете представления.

Ура, Франциско.

0 голосов
/ 29 июля 2011

Вы пытались сбросить пользователя в верхнюю часть списка или как можно ближе к нему, когда список изменил размеры?

...