ここでは Android と Java の初心者ですが、私は長年にわたってさまざまな言語に手を出してきました。これは私を一週間ずっと狂わせてきました。
私の最初のアプリを作成しようとしています。これは、CheckedTextView アイテム (android.R.layout.simple_list_item_multiple_choice によって提供される) で構成される ListView を備えた決まり文句のショッピング リスト アプリです。ListView は CHOICE_MODE_MULTIPLE に設定されています。
ListView のバックエンドは、shoppingItems と呼ばれる ArrayList であり、ShoppingListItem は単純に次のように定義されます。
public class ShoppingListItem {
public String name;
public Boolean checked;
// The obvious constructors here...
}
そして、オーバーライドされた getView() メソッドを持つ ArrayAdapter があります。
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 から子ビューを明示的に削除する
- リスト全体ではなく、ListView の getCheckedItemPositions() の結果を繰り返します。
これが私の最も素朴な試みです:
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 のチェックボックスは、ShoppingItems ArrayList のデータと同期していません。具体的には、次のように始めます。
Item one [ ]
Item two [ ]
Item three [ ]
リストで、項目 1 にチェックを入れます。
Item one [x]
Item two [ ]
Item three [ ]
[削除] ボタンをクリックすると、ポップアップ ダイアログでアクションが確認されます。最初の項目は消えますが、最初の行のチェックボックスはオンのままです。
Item two [x]
Item three [ ]
この時点で、デバッグ メッセージなどによって、ArrayList の内容が正しいことがわかります。つまり、正しい名前の 2 つの ShoppingListItem アイテムが含まれており、その両方の「checked」フィールドが false に設定されていることがわかります。
明らかな何かが欠けていると確信していますが、ここで多数の例を読んだり、ListView関連の回答をさらに読んだりしたにもかかわらず、私の人生ではそれを見ることができません。(詳細を確認する必要がある場合は、現在のアクティビティの完全なコード リストをここで確認できます。)