ListViewにチェックボックスを付け(multiple_choiceの形式)、複数ある項目のうち
チェックがつけられた項目を削除できるようにしたいです。
今組んでいるコードでは、SparseBooleanArrayのvalueAtメソッドを使い
チェックのついているものを取得しようとしています。
しかし実際に動かしてみると、どの項目をチェックしたかに関わらず、
1回目のループでif(checked.valueAt(i))がtrueとなり、
一番上の項目が削除されます。どうすればよろしいでしょうか。
よろしくお願いいたします。
※掲載したコードは、削除ボタンをクリックした際に行われる処理です。
//完了画面へ
View.OnClickListener buttonDelete = new View.OnClickListener() {
@Override
public void onClick(View view) {
EmpView = findViewById(R.id.EmpView);
SparseBooleanArray checked = EmpView.getCheckedItemPositions();
dbOpenHelper = new DBOpenHelper(getApplicationContext());
db = dbOpenHelper.getWritableDatabase();
//チェック項目を消す
try {
for(int i = 0; i<checked.size(); i++) {
if(checked.valueAt(i)) {
db.delete("m_employee","_id = ?",new String[]{codes.get(i)});
}
}
} catch (SQLiteException e) {
e.printStackTrace();
Intent intent = new Intent(getApplicationContext(),Error.class);
startActivity(intent);
} finally {
db.close();
}
Intent intent = new Intent(getApplicationContext(),Complete.class);
startActivity(intent);
}
};
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
以下のコードに問題があります。
for(int i = 0; i<checked.size(); i++) {
if(checked.valueAt(i)) {
db.delete("m_employee","_id = ?",new String[]{codes.get(i)});
}
}
SparseBooleanArray#size()のドキュメントを読むと、次のように書いてあります。
Returns the number of key-value mappings that this SparseBooleanArray currently stores.
arrayが保持しているkey-valueのペアの個数を返すということです。
デバッガを見てもわかるように、SparseBooleanArrayは通常の配列とは異なり、indexのkeyとそのvalueを保持するものです。
よって、今回の場合ですと codes.get(i)
-> codes.get(checked.keyAt(i))
として
for(int i = 0; i<checked.size(); i++) {
if(checked.valueAt(i)) {
db.delete("m_employee","_id = ?",new String[]{codes.get(checked.keyAt(i))});
}
}
と書くと期待した挙動になると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
yona
2017/09/14 16:43
EmpViewの中でSparseBooleanArrayを操作している箇所を質問に追記してください。
aiue
2017/09/14 16:55
すみません。コードを確認したのですがEmpViewの中でSparseBooleanArrayを操作はしていませんでした。そこが問題なのでしょうか?
hiramekun
2017/09/15 13:47
checked周りに問題があるならば、`SparseBooleanArray checked = EmpView.getCheckedItemPositions();`の部分で、EmpViewがどのような関数を実行しているのかをみる必要があります。
aiue
2017/09/15 14:12
デバッグで確認するのでしょうか。すみません。