2009-12-09 2 views
1

Мой сценарий:
-Им пользуюсь списком в режиме множественного выбора, чтобы пользователь мог удалить несколько предметов, которые он проверил сразу.
-Когда пользователь нажимает кнопку удаления, я делаю следующее:
-get позиции отмеченных предметов с использованием: myList.getCheckedItemPositions();
-Получите предметы в этом положении и поместите их в список - toDeleteList.
- (ВОПРОС НА ОСНОВАНИИ ЭТОГО ЭТАПА) используйте myList.setItemChecked (позиция, false), чтобы снять отметку с элемента списка.
-Remove элементов в «toDeleteList»
просмотр списка профайлов в Android-блоге

Теперь, я был «вынужден» вручную снимите элемент списка, так как результат myList.getCheckedItemPositions() не изменяется после удаления из MyList .. т.е.

-if, например, я удаляю 1-й пункт (a) из списка [a, b, c, d], b будет отображаться после удаления, т. Е. в списке списка [b, c, d] - после удаления a.

Вопрос: почему? Поскольку SparseBooleanArray возвращен myList.getCheckedItemPositions(); то же самое и до после удаление из списка - с помощью адаптера.

Я думал (я могу ошибаться), что после удаления элемента из списка через адаптер, массив CheckedItemPositions также должен измениться на отразить новое состояние списка

например. - MyList = [а, б, в, г]
- тогда я проверить элементы в позиции 0 и 3 (проверен на & г)
- проверенные вакансии пункта (mylist.getCheckedItemPositions()) массив Теперь имеет значение true для позиций 0 и 3
- Если я удалю & d из списка, поэтому mylist = [b, c], mylist.getCheckedItemPositions() все тот же, что и выше, т.е. позиции 0 и 3 по-прежнему проверяются после удаления элементов из списка (я думаю, что это не нормально - но опять-таки я ошибаюсь)
- Я ожидал, что он не будет проверяться на позиции 0 & 3, потому что элементов, которые были ранее на этих позициях больше нет в списке.

Я получаю здесь что-то не так (или имею неправильные ожидания :))? кто-то просьба уточнить это ..
Спасибо заранее,

ответ

1

Говоря мое личное мнение, я предполагаю, что позиции будет по-прежнему остается выданными, поскольку getCheckedItemPositions() отражает позицию противостоящей ценности, так что если позиции 0 и 3 по-прежнему существует внутри ListView после удаления они останутся проверенными.

Я мог ошибаться, просто высказывая свое мнение. Удачи

+0

Спасибо .. я понимаю, что вы имеете в виду, но я подумал, что если я использую mylist.getCheckedItemPositions() в новом списке, т.е. с ранее отмеченными элементами больше не в списке (после использования adapter.remove() ..) - результат должен быть пустым/нулевым, потому что мой список больше не содержит отмеченных элементов .. - опять же, возможно, вы правы, спасибо – cire

+0

все, что вам нужно вызвать метод listView.getCheckItemIds(), который вернет идентификаторы элементов checkeds, и он работает для меня, не отменяя ничего из этого;). метод getcheckedItemPositions() не работает :) – Houcine

2

Я боролся с этой же проблемой, и это то, что сработало для меня.

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

private class TagListAdapter extends SimpleCursorAdapter { 
    /** 
    * Stores boolean values for the list items, based on their ids. 
    */ 
    SparseBooleanArray mCheckStates; 

    public TagListAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     mCheckStates = new SparseBooleanArray(); 
    } 

    /** 
    * Sets an id as checked/unchecked. 
    * @param id 
    * @param checked 
    */ 
    public void setChecked(int id, boolean checked) { 
     mCheckStates.put(id, checked); 
    } 

    /** 
    * @see android.widget.ListAdapter#getView(int, View, ViewGroup) 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 

     if(!mCursor.moveToPosition(position)) { 
      throw new IllegalStateException("couldn't move cursor to position " + position); 
     } 

     int id = mCursor.getInt(INDEX_OF_COLUMN_ID); 
     if(mCheckStates.indexOfKey(id) < 0) { 
      // Populate checked value for the first time. 
      mCheckStates.put(id, function_that_returns_if_the_item_is_checked(id)); 
     } 

     // Set the item as checked or unchecked based on the value stored in mCheckStates. 
     mListView.setItemChecked(position, mCheckStates.get(id, false)); 
     return view; 
    } 
} 

Тогда в моей деятельности я поставил onListItemClick(), который выполняет соответствующий чек/снимите флажок действия и устанавливает проверенное состояние адаптера:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    boolean checked = ((CheckedTextView) v).isChecked(); 

    if(checked == true) { 
     // execute uncheck related action 
     function_called_when_item_is_unchecked(id); 
    } else { 
     // execute check related action 
     function_called_when_item_is_checked(id); 
    } 

    // Check/uncheck the item in the adapter. 
    ((TagListAdapter) getListAdapter()).setChecked((int) id, !checked); 
} 
+0

У меня такая же проблема, поэтому я думаю, что это может сработать для меня, но у меня есть 2 вопроса: 1. Откуда вы получаете mListView? 2. Можете ли вы указать пример функции function_that_returns_if_the_item_is_checked? –

+0

Кроме того, эта строка заставляет мое приложение принудительно закрыть (не знаю, почему ...): boolean checked = ((CheckedTextView) v) .isChecked(); –

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