2015-10-30 3 views
0

У меня есть список продуктов, каждая строка имеет функцию «Сохранить», которая будет хранить продукт товара в локальной базе данных. Я использую SwipeMenuListView через https://github.com/baoyongzhang/SwipeMenuListView, и мне нужно проверить, что запись существует или нет в getItemViewType в ListAdapter для удаления функции. Сохранение сохраненной строки. Но проблема в том, что «контрольная запись существует или нет» заставляла мое замораживание списка после notifyDataSetChanged какое-то время (нажмите «Сохранить», затем notifyDataSetChanged, тогда список замерзает, пока я не коснусь списка). Как это исправить? Каждое предложение будет высоко оценено. Заранее спасибо. Вот мой код:Как проверить запись существует в базе данных внутри getItemViewType

@Override 
public boolean onMenuItemClick(int position, SwipeMenu menu, int index) { 
    switch (index) { 
    case 0: 
     break; 
    case 1: 
    ProductDetailsVo.ProductInfo productInfo = listResult.get(position); 
    insertProductToDB(productInfo); 
    break; 
} 

и метод insertProductToDB:

private void insertProductToDB(ProductDetailsVo.ProductInfo productInfo) { 
    databaseManager.insertProductToDB(productInfo); 
    if (adapter != null) { 
    adapter.notifyDataSetChanged(); 
    } 
} 

адаптер:

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

@Override 
public int getItemViewType(int position) { 
    if (databaseManager.isProductSaved(listProds.get(position).getProductId())) {// cause listview freeze 
     return 1; 
    } 
    return 0; 
} 

ответ

1

Так замерзает, вероятно, из-за многочисленных звонков isProductSaved, вы можете быть уверены в том, что комментируя их и тестируя, или профилируя приложение с помощью Android Device Monitor.

Вы можете легко удалить этот доступ к базе данных, добавив поле exists в свою продукцию. Значение по умолчанию будет false, а insertProductToDB присвоит значение true, если вставка успешно завершена. При этом ваш getViewType будет намного быстрее.

@Override 
public int getItemViewType(int position) { 
    if (listProds.get(position).isExists())) { 
     return 1; 
    } 
    return 0; 
} 

Если вы не хотите, чтобы изменить вашу модель объекта с дополнительным полем, вы также можете сохранить карту как в SparseArray в адаптере. Он будет содержать id сохраненных продуктов.

+0

Да, проблема в том, что databaseManager.isProductSaved запускался в потоке пользовательского интерфейса. Я подумал о поле «isExist» в объекте, но если пользователь вернется к предыдущему экрану, тогда он появится после загрузки с сервера. –

+1

Заполните поле 'exist' сразу после получения элементов и перед отображением списка. – tbruyelle

+0

Как я могу проверить элемент продукта, который извлекается с сервера, сохраняется в локальном db? Может быть, мне нужен массив для хранения сохраненных идентификаторов? –

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