2016-06-16 1 views
1

У меня есть ListView с ArrayAdapter.Как обновить ключевые значения SparseBooleanArray при удалении нескольких элементов из списка в Android

Я выбираю несколько элементов, и я пытаюсь удалить их из базы данных и ListView.

Я вложу удалить в контекстном меню режима действия и удаляют, как показано ниже:

if(item.getItemId() == R.id.action_delete) 
    { 
    SparseBooleanArray selected = adapter.getSelectedIds(); 
    short size = (short)selected.size(); 

    for (byte I = 0; I<size; I++) 
     { 
     if (selected.valueAt(I)) 
      { 
      Contact selectedItem = adapter.getItem(selected.keyAt(I)); 
      boolean number = mHelper.deleteCont(myList.get(selected.keyAt(I)).getId()); 
      adapter.remove(selectedItem); 
      adapter.notifyDataSetChanged(); 

      } 
      } 

      // Close CAB (Contextual Action Bar) 
      mode.finish(); 
} 

НО, если я выбрал 3 ListView элементов, чтобы удалить с одной разницей позиции среди них затем клавишу из SparseBooleanArray (который является позицией элемента) НЕ соответствует действительному элементу.

Как я собираюсь поместить в ключи SparseBooleanArray уникальный идентификатор, поступающий из базы данных?

SparseBooleanArray адаптер является следующее:

public void toggleSelection(int position) { 
    selectView(position, !mSelectedItemsIds.get(position)); 
} 

public void selectView(int position, boolean value) { 
    if (value) 
     mSelectedItemsIds.put(position, value); 
    else 
     mSelectedItemsIds.delete(position); 
    notifyDataSetChanged(); 
} 

public SparseBooleanArray getSelectedIds() { 
    return mSelectedItemsIds; 
} 
+2

Использование реальных идентификаторов ... не позиция – Selvin

ответ

2

SPARSE логический массив, в отличие от регулярного булева массива (boolean[]) предназначен для использования, когда ваш целочисленный индекс не обязательно однородным, например, в случае числовых идентификаторов.

Вы должны использовать числовой идентификатор для каждого элемента в SparseBooleanArray, а не просто индекс элемента. Это должно решить вашу проблему, просто удалив идентификатор, который был удален из SparseBooleanArray, и не беспокоиться об индексе.

Просто убедитесь, что каждый элемент имеет уникальный идентификатор целого числа, а затем используйте его при добавлении его к SparseBooleanArray.

+0

Да, но при попытке передать только одно уникальное целое для одного выбранного элемента, а не идентификаторы для нескольких элементов. –

+0

. Ok Мне удалось передать все выбранные значения, но Contact selectedItem = адаптер. GetItem (selected.keyAt (I)); не работает, потому что ему нужна позиция для получения определенного элемента. Должен ли я объединить уникальный идентификатор с позицией? –

+1

У вас должен быть метод для определения позиции по id - в основном он просматривает список элементов, сравнивая идентификатор, а затем возвращает индекс элемента в списке для элемента, соответствующего данному идентификатору. –

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