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ответы здесь, я не могу видеть это для моей жизни.(Полный список кодов действий в том виде, в каком они есть на данный момент, можно найти здесь , если вам нужно больше.)