Проблема производительности с ListView и CursorAdapter для большого объема данных - PullRequest
4 голосов
/ 04 октября 2011

У меня около 4 тыс. Строк в таблице sqlite, в таблице 7 столбцов.

Я создал рабочий ListView со своим собственным CursorAdapter.

Запрос похож на этот SELECT * FROM [table] ORDER BY [column] DESC;

Таблица имеет первый столбец _id INTEGER PRIMARY KEY, но упорядочение выполняется по другому столбцу.

Для открытия базы данных используется мой собственный подкласс SQLiteOpenHelper

Создание курсора

mySQLiteOpenHelper pm = new mySQLiteOpenHelper();
SQLiteDatabase db = pm.getReadableDatabase();
Cursor c = db.query([tablename], new String[]{"_id", "[column]", "[column]", "[column]", "[column]", "[column]"}, null, null, null, null, "name ASC");

Передав его в ListView

ListView lv = (ListView) findViewById(R.id.list_items);
lv.setOnItemClickListener(this);
pa = new ItemsAdapter(ItemsActivity.this, c);

В ItemsAdapter я переопределил

private LayoutInflater inflater;

@Override
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
    return inflater.inflate(R.layout.items_row, arg2,false);
}

и

@Override
public void bindView(View rtn, Context arg1, Cursor c) {
    item_name = (TextView) rtn.findViewById(R.id.item_name);
    item_description = (TextView) rtn.findViewById(R.id.item_description);
    item_catalog_id = (TextView) rtn.findViewById(R.id.item_catalog_id);
    item_true_price = (TextView) rtn.findViewById(R.id.item_true_price);
    item_display_price = (TextView) rtn.findViewById(R.id.item_display_price);
    item_button = (Button) rtn.findViewById(R.id.item_button);

    item = new MyWrapClass(c);

    // some work with item to fill up all UI items

}

MyWrapClass

public final class MyWrapClass {

    public String name = "";
    public String notes = "";
    public int id = 0;
    public String catalogId = "";
    public int price = 0;
    public int publicPrice = 0;
    public String groupPrice = "";
    public int order_count = 0;

    public MyWrapClass(Cursor c) {
        try {
            id = c.getInt(0);
            catalogId = c.getString(1);
            name = c.getString(2);
            price = c.getInt(3);
            publicPrice = c.getInt(4);
            groupPrice = c.getString(5);
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
    }
}

Та же строкаКод инициализации был использован в ListView, и там он работал очень хорошо.

Так что, если вы можете сказать из этого кода, есть ли какая-то причина, почему следует загружать 6 элементов строки (одна высота экрана) и обновлять прокрутку (среднеекогда вы прокручиваете один элемент вниз) занимает до 1 минуты?

Просто загрузка ListView занимает до 2 минут, а затем примерно половину времени, чтобы прокрутить один элемент списка вниз / вверх.Где может быть проблема производительности?

1 Ответ

2 голосов
/ 04 октября 2011

Я бы создал пользовательский Adapter, который загружает только то, что нужно для активных представлений, и который повторно использует представления в методе getView().Это действительно довольно просто.

Обновление

Я нашел отличный пример, который вы можете использовать: http://android.amberfog.com/?p=296

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...