2010-07-23 3 views
0

Я получаю очень проворную прокрутку, используя код ниже , создавая ListView из курсора. Есть ли что-то, что я делаю неправильно, или каким-либо образом улучшить производительность этого ListView?Прокрутка Jerky при использовании SimpleCursorAdapter с ListView

bookmarksListView = (ListView)findViewById(R.id.bookmarks_listview); 
         bookmarksDbCursor = bookmarkStore.getCursor(); 
         startManagingCursor(bookmarksDbCursor); 
         String[] bookmarksColumns = new String[3]; 
         bookmarksColumns[0] = "TITLE"; 
         bookmarksColumns[1] = "URL"; 
         bookmarksColumns[2] = "ICONID"; 
         int[] bookmarksViews = new int[3]; 
         bookmarksViews[0] = R.id.title_text; 
         bookmarksViews[1] = R.id.subtitle_text; 
         bookmarksViews[2] = R.id.icon_view; 
         bookmarksListAdapter = new SimpleCursorAdapter(this, 
             R.layout.list_item, 
             bookmarksDbCursor, 
             bookmarksColumns, 
             bookmarksViews); 
         bookmarksListView.setAdapter(bookmarksListAdapter); 
         bookmarksListView.setOnItemClickListener(new OnItemClickListener() 
{ 
           @Override 
           public void onItemClick(AdapterView<?> parent, View view, 
               int position, long id) { 
             Toast.makeText(BookmarkHistoryTabActivity.this, "Clicked ID " + 
Long.toString(id), Toast.LENGTH_SHORT).show(); 
           } 
         }); 
         registerForContextMenu(bookmarksListView); 

Примечание: bookmarkStore.getCursor() возвращает неуправляемый курсор из SQLite базы данных, содержащей столбцы bookmarksColumns.

Значки, которые я загружаю (из R.drawable), не являются проблемой - я попытался отключить их, и он не имеет эффекта . Я столкнулся с аналогичной проблемой прокрутки с пользовательским списком ListAdapter , который расширяет BaseAdapter, который я написал некоторое время назад, и это было вызвано неправильным , устанавливающим значения представления в getView(). Я разрешил его с помощью исправленного сообщения по адресу How to load the Listview "smoothly" in android .. ., , но это было для пользовательского класса адаптера, и я не совсем уверен, как реализовать это исправление, когда я использую запас SimpleCursorAdapter, или если это исправление относится даже к этой ситуации.

EDIT: Запрос возвращения информации о базе данных выглядит следующим образом, в случае, который помогает:

public Cursor getCursor() { 
      openDB(); 
      Cursor c = mDB.query(DB_TABLENAME, new String[]{"_id", "ICONID", "DATE", "TITLE", "URL"}, null, null, null, null,"DATE DESC"); 
      return c; 
    } 

edit2: Я понятия не имею, почему, но это происходит только в андроид 1.6+ я пытался изменение моего запроса, удаление сортировки и т. д. для моего курсора, кажется, ничего не помогает. База данных очень маленькая (< 20 элементов) и содержит только столбцы, присутствующие в запросе выше.

ответ

0

Мы решили, что это проблема с версиями Android 1.6+, а не с нашим кодом, и оставляем ее как есть.

0

Ваш код выглядит хорошо. Поэтому он, вероятно, находится в другой области. Моя догадка (так как я не вижу ничего другого) заключается в том, что у вашей базы данных возникают проблемы. Попробуйте индексировать вашу базу данных или упростить запросы в ней. Также попробуйте выполнить сжатие SQLite, чтобы избавиться от любого мусора, который может скрываться в базе данных.

+0

Будут ли проблемы, которые вы описываете, все еще вызывают проблемы, если в базе данных очень мало элементов? Я все еще вижу это поведение даже с менее чем 10 элементами в базе данных. – QRohlf

+0

Больше, чем проблема с количеством элементов в базе данных, это будет скорее проблемой с самим запросом. Например, если вы делаете много объединений, союзов, групп/отдельных и/или SQL-функций. Если его просто выбрать * от чего бы то ни было, проблема не должна быть проблемой. Если база данных «действительно» беспорядочна (не ваша ошибка, запуск чистой в этой базе данных исправит это). – Moncader

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