質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

1441閲覧

ListViewで選択された項目を削除したい

j06110611

総合スコア54

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/05/16 13:06

編集2020/05/18 03:46

現状

全項目選択されていたら、特に不具合は起きず全削除される。
3つ項目を作って1つ目・3つ目にチェックすると、1つ目と2つ目が削除される
→多分上から順に削除されてしまう。

削除している部分

MainActivity

1adapter.remove(MakeQuizActivity.titleList.get(i));

知りたいこと

解決策やヒントをください。お願いします!

コード

MainActivity

1public class MainActivity extends AppCompatActivity { 2 private ArrayList data = new ArrayList<String>(); 3 private static final int REQUEST_CODE = 1; 4 private ArrayAdapter adapter; 5 public static int count = 1; 6 //ListView listView = (ListView) findViewById(R.id.listView); 7 ListView listView; 8 9 @Override 10 protected void onActivityResult(int request_Code, int resultCode, Intent result){ 11 switch(request_Code){ 12 //MakeQuizActivityから戻ってきた場合 13 case(REQUEST_CODE): 14 //クイズを作るボタンを押して戻ってきたときの処理 15 if(resultCode == RESULT_OK){ 16 data.add(result.getStringExtra("INPUT_TITLE")); 17 adapter.notifyDataSetChanged(); 18 } 19 //押されなかったときの処理 20 else if(resultCode == RESULT_CANCELED){ 21 22 } 23 break; 24 } 25 } 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_main); 29 30 // リスト項目とListViewを対応付けるArrayAdapterを用意する 31 adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_multiple_choice, data); 32 listView = findViewById(R.id.listView); 33 // ListViewにArrayAdapterを設定する 34 listView.setAdapter(adapter); 35 SharedPreferences sp = getSharedPreferences("DataStore",MODE_PRIVATE); 36 SharedPreferences.Editor editor = sp.edit(); 37 PreferenceManager.init(sp,editor); 38 Button button = (Button) findViewById(R.id.makeQuiz_Button1); 39 button.setOnClickListener(new View.OnClickListener() { 40 @Override 41 public void onClick(View v) { 42 Intent intent = new Intent(MainActivity.this, com.test.quizmaker.MakeQuizActivity.class); 43 startActivityForResult(intent, REQUEST_CODE); 44 } 45 }); 46 Button button1 = (Button)findViewById(R.id.update_Button); 47 button1.setOnClickListener(new View.OnClickListener() { 48 @Override 49 public void onClick(View v) { 50 //現時点のコード 51 int updateInt = PreferenceManager.sp.getInt("count",10); 52 for(int i = 1; i<=updateInt; i++){ 53 String updateTitle = PreferenceManager.sp.getString(DataKeys.TITLE.getValue() + String.valueOf(i), "nothing"); 54 data.add(updateTitle); 55 adapter.notifyDataSetChanged(); 56 } 57 } 58 }); 59 } 60 //オプションメニューを作成 61 public boolean onCreateOptionsMenu(Menu menu){ 62 //menuにcustom_menuレイアウトを適用 63 getMenuInflater().inflate(R.menu.custom_menu, menu); 64 //オプションメニューを表示する場合はtrue 65 return true; 66 } 67 //メニュー選択時の処理 68 @Override 69 public boolean onOptionsItemSelected(MenuItem menuItem){ 70 //押されたメニューのIDで処理を振り分ける 71 //if(menuItem.getItemId() == R.id.menuClear){ 72 switch (menuItem.getItemId()) { 73 case R.id.menuSelect: 74 //マップの情報を取得する 75 SparseBooleanArray checked = listView.getCheckedItemPositions(); 76 77 for (int i = 0; i < checked.size(); i++) { 78 if (checked.valueAt(i)) { 79 for (Map.Entry<String, String> entry : MakeQuizActivity.mapTitle.entrySet()) { 80 if (entry.getValue().equals(MakeQuizActivity.titleList.get(i))) { 81 Log.v("Debug", "キーを取得" + entry.getKey()); 82 adapter.remove(MakeQuizActivity.titleList.get(i)); 83 adapter.notifyDataSetChanged(); 84 PreferenceManager.remove(entry.getKey()); 85 } 86 } 87 } 88 for (Map.Entry<String, String> entry : MakeQuizActivity.mapQuiz.entrySet()) { 89 if (entry.getValue().equals(MakeQuizActivity.quizList.get(i))) { 90 Log.v("Debug", "キーを取得" + entry.getKey()); 91 PreferenceManager.remove(entry.getKey()); 92 } 93 } 94 for (Map.Entry<String, String> entry : MakeQuizActivity.mapAnswer.entrySet()) { 95 if (entry.getValue().equals(MakeQuizActivity.answerList.get(i))) { 96 Log.v("Debug", "キーを取得" + entry.getKey()); 97 PreferenceManager.remove(entry.getKey()); 98 } 99 } 100 } 101 break; 102 case R.id.menuClear: 103 adapter.clear(); 104 adapter.notifyDataSetChanged(); 105 PreferenceManager.clear(); 106 count = 1; 107 break; 108 } 109 return true; 110 } 111} 112

MakeQuizActivity

1ublic class MakeQuizActivity extends AppCompatActivity { 2 public static Map<String,String> mapTitle = new HashMap<>(); 3 public static Map<String,String> mapQuiz = new HashMap<>(); 4 public static Map<String,String> mapAnswer = new HashMap<>(); 5 public static ArrayList titleList = new ArrayList<String>(); 6 public static ArrayList quizList = new ArrayList<String>(); 7 public static ArrayList answerList = new ArrayList<String>(); 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_make_quiz); 13 14 Button button2 = (Button)findViewById(R.id.makeQuiz_Button2); 15 button2.setOnClickListener(new View.OnClickListener() { 16 @Override 17 public void onClick(View v) { 18 Intent intent = new Intent(MakeQuizActivity.this,com.test.quizmaker.MainActivity.class); 19 String strTitle = ((EditText)findViewById(R.id.editText)).getText().toString(); 20 String strQuiz = ((EditText)findViewById(R.id.editText2)).getText().toString(); 21 String strAnswer = ((EditText)findViewById(R.id.editText3)).getText().toString(); 22 PreferenceManager.saveInt(MainActivity.count); 23 PreferenceManager.saveString(strTitle, DataKeys.TITLE, String.valueOf(MainActivity.count)); 24 titleList.add(strTitle); 25 mapTitle.put(DataKeys.TITLE.getValue() + String.valueOf(MainActivity.count),strTitle); 26 PreferenceManager.saveString(strQuiz, DataKeys.QUIZ, String.valueOf(MainActivity.count)); 27 quizList.add(strQuiz); 28 mapQuiz.put(DataKeys.QUIZ.getValue() + String.valueOf(MainActivity.count),strQuiz); 29 PreferenceManager.saveString(strAnswer, DataKeys.ANSWER, String.valueOf(MainActivity.count)); 30 answerList.add(strAnswer); 31 mapAnswer.put(DataKeys.ANSWER.getValue() + String.valueOf(MainActivity.count),strAnswer); 32 String title = PreferenceManager.sp.getString(DataKeys.TITLE.getValue() + String.valueOf(MainActivity.count), "Nothing"); 33 String quiz = PreferenceManager.sp.getString(DataKeys.QUIZ.getValue() + String.valueOf(MainActivity.count),"Nothing"); 34 String answer = PreferenceManager.sp.getString(DataKeys.ANSWER.getValue() + String.valueOf(MainActivity.count),"Nothing"); 35 intent.putExtra("INPUT_TITLE", title); 36 intent.putExtra("INPUT_QUIZ",quiz); 37 intent.putExtra("INPUT_ANSWER",answer); 38 MainActivity.count ++; 39 Log.v("Debug","countの値:" + String.valueOf(MainActivity.count)); 40 setResult(RESULT_OK, intent); 41 finish(); 42 } 43 }); 44 } 45} 46

PreferenceManager

1public class PreferenceManager{ 2 3 public static SharedPreferences sp; 4 private static SharedPreferences.Editor spEditor; 5 6 public static void init(SharedPreferences sp1, SharedPreferences.Editor editor1) { 7 sp = sp1; 8 spEditor = editor1; 9 } 10 11 public static void saveString(String s, DataKeys key, String c) { 12 spEditor.putString(key.getValue() + c, s); 13 spEditor.apply(); 14 } 15 16 public static void saveInt(int c) { 17 spEditor.putInt("count", c); 18 spEditor.apply(); 19 } 20 21 public static void remove(String key){ 22 spEditor.remove(key).commit(); 23 } 24 25 public static void clear(){ 26 spEditor.clear().commit(); 27 } 28}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

次のようにすれば解決します。

titleList.get(checked.keyAt(i))

投稿2020/05/16 13:13

編集2020/05/18 05:04
Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

j06110611

2020/05/16 13:56

同じようにやってみたのですが、3つ目の項目が削除されないです。
Zuishin

2020/05/16 13:57

どうなりますか?
j06110611

2020/05/16 13:59

さっきと同じように動きます。要は1つ目と3つ目の項目にチェックをつけて削除すると1つ目と2つ目が削除される感じです。
Zuishin

2020/05/16 14:02

削除している場所はどこですか? つまり、どの行をコメントアウトすると削除されなくなりますか?
j06110611

2020/05/16 14:04

ListViewから項目を削除してるのはこの2行ですね adapter.remove(MakeQuizActivity.titleList.get(i)); adapter.notifyDataSetChanged();
Zuishin

2020/05/16 14:21

であれば、i を逆順にすることで逆から削除されるように思いますが。それでできないということは、titleList.get(i) で返ってくる数値が違うのではないかと思います。実際に何がどのような順番で返ってきているのか調べてみてください。
j06110611

2020/05/17 13:45

デバッグして、1つめの項目と3つ目の項目をチェック(2個チェックされた状態)で削除すると、1回目はiに1が入り、2回目はiに0が入りました。なので、2つ目の項目と1つ目の項目が削除されてしまうということが分かったのですが、どうしたらいいと思いますか?本当は1つ目の項目と3つ目の項目を削除したいのですが。
Zuishin

2020/05/17 13:49

titleList.get(i) で 0 と 2 を返すようにしてみたらどうでしょうか。
j06110611

2020/05/17 14:20

必ずしも、1つ目の項目と3つ目の項目を削除すると決まっているわけではなくて、選択した項目だけが削除されるようにしたいんです。例えば4つ項目作って2つ目の項目と4つ目の項目を選択する可能性があってもしっかり機能させるようにしたいんです。
Zuishin

2020/05/17 14:23

そうではなく、3 つ目の項目が選択されたときにきちんと 2 を返すようにしてみてはということです。
Zuishin

2020/05/17 15:08

> 全項目選択されていたら、特に不具合は起きず全削除される。 リストに入っている項目を i に無関係に順に返している可能性がありますね。
j06110611

2020/05/17 15:11

でも、選択せずに削除すると、何も起きないので違うんじゃないかなと思います。
Zuishin

2020/05/17 15:12

選択した数だけ前から順に返しているんじゃないでしょうか。
j06110611

2020/05/17 15:16

それは読んでみてもわかるのですが、どうすればいいかわからないです。
Zuishin

2020/05/17 15:19

MakeQuizActivity.titleList.get(i) が正しく実装されていないんじゃないかということです。ここにそのコードは書かれていないので、それ以上はわかりません。
j06110611

2020/05/17 15:24

titleListはtextViewで書かれた文字列を追加してるだけのListなんです。なのでListViewに表示される項目の数と一致しているはずです。
Zuishin

2020/05/17 15:36

では、titleList.get(i) ではなく、titleList.get(checked.valueAt(i)) ではどうなりますか?
j06110611

2020/05/18 03:17

checkedがboolean型?なので赤字になっちゃいますね。
Zuishin

2020/05/18 03:35

間違えました。titleList.get(checked.keyAt(i)) ではどうなりますか?
j06110611

2020/05/18 04:44

できました!ありがとうございます!すごい助かりました!1つ目の項目と3つ目の項目を選択して削除すると、2つ目の項目だけ残りました!
guest

0

for (int i = 0; i < checked.size(); i++) { if (checked.valueAt(i)) { for (Map.Entry<String, String> entry : MakeQuizActivity.mapTitle.entrySet()){

ではチェックしたアイテムの数を取得してループを回しているのでおかしくなります。

1☑
2
3☑
4
5☑
6

と実際はなっているのにもかかわらず、そのコードだと

1☑
2☑
3☑

と認識されていて、実際のListから1,2,3が削除されているのでしょう。

MakeQuizActivity.mapTitleの実装が書かれていないので、それ以上は分かりかねますが、基本的にチェックボックスなどのユーザー入力を伴うListViewないしRecyclerViewはカスタムアダプターを作って、自分でレイアウトしたListを操作する方が圧倒的に楽です。

投稿2020/05/17 15:42

CAIOS

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問