Android - 通过ListView滚动会导致Out of Bounds Exception

时间:2011-07-28 22:08:42

标签: android listview android-arrayadapter

我正在开发一个主要由列表视图组成的应用程序。它由我自己的自定义数组适配器支持,其大小每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是支持listAdapter的ArrayList,getData()是使用最终将在列表视图中显示的相关信息填充myData的函数。

有解决这个问题的好方法吗?

此致

4 个答案:

答案 0 :(得分:2)

您使用的是自定义适配器吗?

也许在你的getViewTypeCount()和getItemViewType(int position)中,它超出了界限。视图类型计数应为(0,n),但项视图类型应为[0,n)。

E.g。视图类型计数应为2

但视图类型应为0和1,而不是1和2.

答案 1 :(得分:2)

尝试覆盖适配器类的getCount()函数:

@Override
public int getCount() {
return [list that contains data].size();
}

答案 2 :(得分:0)

您是否尝试将用户重置为列表顶部或在列表更改大小时尽可能接近?

答案 3 :(得分:0)

很抱歉,也许不是这个问题的答案,但对我来说这种无限循环似乎不是正确的方法,即使它是异步任务。

我会尝试使用AlarmManager或Timer。

话虽如此,看来你所拥有的是一种竞争条件,考虑到当你要求数据或特定位置并重建视图时,它不是立即。

干杯, 旧金山。