Не удается синхронизировать ListView с ListArray при удалении отмеченных элементов списка - PullRequest
0 голосов
/ 16 ноября 2011

Android и Java noob здесь, хотя я баловался на разных языках на протяжении многих лет.Это сводило меня с ума всю неделю.

Попытка написать мое первое приложение, и это приложение со списком покупок клише, с ListView, состоящим из элементов CheckedTextView (предоставлено android.R.layout.simple_list_item_multiple_choice),Для ListView установлено значение CHOICE_MODE_MULTIPLE.

Бэкендом для ListView является ArrayList, называемый shoppingItems, где ShoppingListItem просто определяется как:

public class ShoppingListItem {

    public String name;
    public Boolean checked;

    // The obvious constructors here...

}

, и у меня есть ArrayAdapter с переопределенным методом getView ():

shoppingListAdapter = new ArrayAdapter<ShoppingListItem>
                        (this,
                        android.R.layout.simple_list_item_multiple_choice,
                        android.R.id.text1,
                        shoppingItems)
{
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        CheckedTextView rowView = (CheckedTextView)convertView;

        if (rowView==null){
            LayoutInflater inflater = getLayoutInflater();
            rowView = (CheckedTextView)inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);
        }               
        rowView.setText(shoppingItems.get(position).name);
        rowView.setChecked(shoppingItems.get(position).checked);
        return rowView;
    }
};

Все работает нормально - добавление элементов, редактирование элементов, удаление отдельного элемента через его контекстное меню - кроме удаления всех отмеченных элементов с помощью кнопки «Удалить» в нижней части экрана.

Я, должно быть, попытался написать свой метод removeCheckedItems с полдюжины различных способов, включая различные комбинации:

  • удаление отмеченных элементов с помощью адаптера списка (который из всего, что я прочитал,как это должно работать)
  • удаление отмеченных элементов непосредственно из ArrayList, затем вызов notifyDatasetChanged ()
  • явное удаление дочерних представлений из ListView
  • итерация по результатамgetCheckedItemPositions () ListView, а не весь список

Вот моя самая наивная попытка:

private void removeCheckedItems(){

    ShoppingListItem item;
    for (int i=0; i< adapter.getCount(); i++) {
        item = shoppingListAdapter.getItem(i);
        if (shoppingListView.isItemChecked(i)){
            item = shoppingItems.get(i);
            shoppingListAdapter.remove(item);
        }
    }
    removeBtn.setEnabled(false);
}

Однако я делаю это, однако: флажки в ListView просто неt синхронизироваться с данными в ArrayList ShoppingItems.В частности, если я начну с:

Item one   [ ]
Item two   [ ]
Item three [ ]

в списке, затем отметьте первый пункт:

Item one   [x]
Item two   [ ]
Item three [ ]

, затем нажмите кнопку «Удалить», которая подтверждает действие через всплывающее диалоговое окно,первый элемент исчезает, но флажок в первой строке остается установленным:

Item two   [x]
Item three [ ]

На этом этапе с помощью сообщений отладки и т. д. я знаю, что содержимое ArrayList является правильным, т.е.содержит два элемента ShoppingListItem с правильными именами, оба из которых 'отмечены' полями установлены на false.

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

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Вам просто нужно снова вызвать метод fillData () из вашего метода removeCheckedItems.

Каждый раз, когда вы вносите изменения в данные, вам нужно снова «заполнять» данные для списка, обновлять списокадаптер.

Пройдите обучение Google Search for 'ListActivity fillData', и вы получите множество отличных примеров.

Вот несколько хороших примеров:

Позвольте мнеЗнай, если ты застрянешь, я смогу помочь больше завтра.Я сделал это много, поэтому я могу помочь вам справиться с этим.

0 голосов
/ 12 марта 2012

Для справки, единственный способ, которым я когда-либо получал эту работу, состоял в том, чтобы использовать мой собственный макет строки и раздувать его в getView() вместо использования android.R.layout.simple_list_item_multiple_choice. Все работало так, как я и ожидал, когда делал это, включая мгновенное и правильное обновление ListView, когда я изменял данные через ArrayAdapter, и notifyDatasetChanged() также, когда я изменял данные напрямую.

...