我有一个ListView,它使用SimpleCursorAdapter从SQLite数据库中获取数据。实际的数据库文件是1049kB(其中包括6个我无法获取的相当大的TEXT列),并且所有数据(从我正在获取到列表视图的行)仅为415kB,总共2894行和31列。
问题是,当我将所有行提取到ListView并快速滚动到底部(或至少在第2000行之外的某处)并开始向上滚动时,滚动非常迟缓,我得到“Cursor:skip_rows row# LogCat中的###“。当我向下滚动或在前2000行中向上滚动时,它永远不会发生。如果我之前已经显示过一次行,也不会发生这种情况。
发生了什么事?显然它与光标已用完它的最大缓存大小为1MB这一事实有关。但首先它不应该需要那么多的内存(?)和第二个为什么它只在滚动时才会发生?有什么方法(除了从数据库中获取更少的列 - 我实际上在列表视图中显示所有30列)?
logcat的
02-19 21:55:37.329: E/CursorWindow(9203): need to grow: mSize = 1048576, size = 2, freeSpace() = 1, numRows = 2347
02-19 21:55:37.329: E/CursorWindow(9203): not growing since there are already 2347 row(s), max size 1048576
02-19 21:55:37.329: E/Cursor(9203): Failed allocating 2 bytes for text/blob at 2346,26
02-19 21:55:37.349: D/Cursor(9203): finish_program_and_get_row_count row 547
02-19 21:55:37.449: D/Cursor(9203): skip_rows row 2893
02-19 21:55:37.539: D/Cursor(9203): skip_rows row 2892
02-19 21:55:38.709: D/Cursor(9203): skip_rows row 2891
02-19 21:55:38.879: D/Cursor(9203): skip_rows row 2890
...等等,同时向上滚动到之前未显示的行>排〜2000 ......